2014-10-29 171 views
6

我正在刷我的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当了methodA它Thread.sleep代码函数去,这两个方法将启动级联,并导致不确定的睡眠?

想法?

回答

9

不,这不会造成死锁。

要创建僵局,需要两个Thread小号ab,两种资源xy。如果ax持有锁定,并且还需要对y锁定,但by持有锁定,并且还需要锁定x,则发生死锁。

您只有一件事在这里锁定,this.sync,所以没有发生死锁。

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

+0

感谢您的答案。我开始更好地理解这一点。不过,我确实有另一个问题,但我不想继续发布任何东西到SO。你可以直接到达吗?非常感谢帮忙。 – matcartmill 2014-10-30 23:28:59

6

没有僵局,它被称为Reentrant Synchronization,如果线程已获得锁它不会阻止自己,

想象的那样,你把自己锁在一个房间里,现在你是房间内免费和其他房间锁定,你有钥匙或解锁,并从该房间的门,其他人(线程)想要使用该房间(方法)被阻止,不是你