Java 这怎么会导致僵局?
我正在复习Java,有人在练习中问过我这个问题。以下情况如何导致僵局Java 这怎么会导致僵局?,java,multithreading,Java,Multithreading,我正在复习Java,有人在练习中问过我这个问题。以下情况如何导致僵局 private Object sync = new Object(); public void methodA() throws InterruptedException { synchronized(this.sync) { Thread.sleep(1000); } } public void methodB() throws Interr
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,那么这两个方法将开始级联并导致无限期睡眠
想法?不,这不会导致死锁 要创建死锁,您需要两个
线程sa
和b
以及两个资源x
和y
。如果a
锁定了x
并且还需要锁定y
,但是b
锁定了y
并且还需要锁定x
,则会发生死锁
您在这里只有一件事要锁定,this.sync
,因此不会发生死锁
如果在另一个线程调用methodA
时输入了methodB
,则它将等待methodA
释放锁后再继续。如果在另一个线程调用methodB
时输入了methodA
,则它将等待methodB
释放锁后再继续。请注意,methodB
调用methodA
这一事实并不重要,因为它与这个.sync
没有死锁是相同的锁,如果线程已经获得了锁,它不会被自身阻塞
想象一下,当你把自己锁在一个房间里,现在你在这个房间里自由了,其他房间都被锁上了,你有钥匙或者没有锁,还有那个房间的门,其他想要使用那个房间(方法)的人(线程)被阻止了,而不是你谢谢你的回答。我开始更好地理解这一点了。不过,我还有一个问题,但我不想一直把随机的东西贴到网上。你能直接联系到我吗?非常感谢你的帮助。