这怎么会导致死锁?

时间:2014-10-29 23:53:25

标签: java multithreading

我正在刷新我的Java,在练习中被问到了这个问题。以下怎么会导致死锁?

private Object sync = new Object();

    public void methodA() throws InterruptedException {
        synchronized(this.sync) {
            Thread.sleep(1000);
        }
    }

    public void methodB() throws InterruptedException {
        synchronized(this.sync) {
            this.methodA();
        }
    }

我的猜测是,如果methodB在执行Thread.sleep函数时调用methodA,那么这两个方法会开始级联并导致无限期睡眠吗?

思想?

2 个答案:

答案 0 :(得分:9)

不,这不会导致死锁。

要创建死锁,您需要两个Thread s ab以及两个资源xy。如果ax持有锁定并且还需要锁定y,但b会对y持锁并且还需要锁定x 1}},然后发生死锁。

你只需要锁定一件事this.sync,所以不会发生死锁。

如果在另一个线程调用methodB时输入methodA,则它会等到methodA释放锁定后再继续。如果在另一个线程调用methodA时输入methodB,则它将等到methodB释放锁定后再继续。请注意,methodB调用methodA这一事实并不重要,因为它与this.sync上的锁相同。

答案 1 :(得分:6)

没有死锁,它被称为Reentrant Synchronization,如果线程已经获得了锁定,它本身就不会被阻塞,

想象一下,当你把自己锁在一个房间里时,你可以在那个房间和其他被锁住的房间里自由,你有钥匙或解锁并且有房间的门,其他人(线程)想要使用那个房间(方法)被封锁,不是你