这怎么会导致死锁?

mat*_*ill 6 java multithreading

我正在刷我的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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的猜测是,如果methodB在执行Thread.sleep函数时调用methodA,那么这两个方法会开始级联并导致无限期睡眠吗?

思考?

rge*_*man 9

不,这不会导致死锁.

要创建僵局,需要两个Thread小号ab,两种资源xy.如果a持有锁x并且还需要锁定y,但b持有锁y并且还需要锁定x,则会发生死锁.

你只有一件事要锁定this.sync,所以不会发生死锁.

如果methodB在另一个线程调用时进入methodA,则它将等待直到methodA释放锁定,然后再继续.如果methodA在另一个线程调用时进入methodB,则它将等待直到methodB释放锁定,然后再继续.请注意,methodB调用methodA无关紧要,因为它是相同的锁定this.sync.


Jig*_*shi 6

没有死锁,它被称为Reentrant Synchronization,如果线程已经获得了锁,它不会被自己阻塞,

想象当你把自己锁在一个房间里,现在你在那个房间和其他被锁住的房间是自由的,你有钥匙或解锁并且从那个房间有门,其他人(线程)想要使用那个房间(方法)被阻止, 不是你