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

我正在复习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,那么这两个方法将开始级联并导致无限期睡眠


想法?

不,这不会导致死锁

要创建死锁,您需要两个
线程
s
a
b
以及两个资源
x
y
。如果
a
锁定了
x
并且还需要锁定
y
,但是
b
锁定了
y
并且还需要锁定
x
,则会发生死锁

您在这里只有一件事要锁定,
this.sync
,因此不会发生死锁


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

没有死锁是相同的锁,如果线程已经获得了锁,它不会被自身阻塞


想象一下,当你把自己锁在一个房间里,现在你在这个房间里自由了,其他房间都被锁上了,你有钥匙或者没有锁,还有那个房间的门,其他想要使用那个房间(方法)的人(线程)被阻止了,而不是你

谢谢你的回答。我开始更好地理解这一点了。不过,我还有一个问题,但我不想一直把随机的东西贴到网上。你能直接联系到我吗?非常感谢你的帮助。