我正在刷新我的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,那么这两个方法会开始级联并导致无限期睡眠吗?
思想?
答案 0 :(得分:9)
不,这不会导致死锁。
要创建死锁,您需要两个Thread
s a
和b
以及两个资源x
和y
。如果a
对x
持有锁定并且还需要锁定y
,但b
会对y
持锁并且还需要锁定x
1}},然后发生死锁。
你只需要锁定一件事this.sync
,所以不会发生死锁。
如果在另一个线程调用methodB
时输入methodA
,则它会等到methodA
释放锁定后再继续。如果在另一个线程调用methodA
时输入methodB
,则它将等到methodB
释放锁定后再继续。请注意,methodB
调用methodA
这一事实并不重要,因为它与this.sync
上的锁相同。
答案 1 :(得分:6)
没有死锁,它被称为Reentrant Synchronization,如果线程已经获得了锁定,它本身就不会被阻塞,
想象一下,当你把自己锁在一个房间里时,你可以在那个房间和其他被锁住的房间里自由,你有钥匙或解锁并且有房间的门,其他人(线程)想要使用那个房间(方法)被封锁,不是你