在练习中,我正在刷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();
}
}
我的猜测是,如果方法B在执行Thread.sleep函数的同时调用方法A,则这两个方法将开始级联并导致不确定的 sleep ?
有什么想法吗?
最佳答案
不,这不会导致死锁。
要创建死锁,您需要两个Thread
,a
和b
以及两个资源x
和y
。如果a
拥有x
的锁,并且还需要y
的锁,但是b
拥有y
的锁,并且还需要x
的锁,那么就会发生死锁。
此处只有锁定一件事this.sync
,因此不会发生死锁。
如果在另一个线程调用methodB
的同时输入了methodA
,则它将等待直到methodA
释放该锁,然后才能继续。如果在另一个线程调用methodA
的同时输入了methodB
,则它将等待直到methodB
释放该锁,然后才能继续。请注意,methodB
调用methodA
的事实并不重要,因为它与this.sync
上的锁相同。
关于java - 这怎么会造成僵局?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26642696/