在练习中,我正在刷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 ?

有什么想法吗?

最佳答案

不,这不会导致死锁。

要创建死锁,您需要两个Threadab以及两个资源xy。如果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/

10-09 05:43