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,那么这两个方法会开始级联并导致无限期睡眠吗?
思考?
不,这不会导致死锁.
要创建僵局,需要两个Thread小号a和b,两种资源x和y.如果a持有锁x并且还需要锁定y,但b持有锁y并且还需要锁定x,则会发生死锁.
你只有一件事要锁定this.sync,所以不会发生死锁.
如果methodB在另一个线程调用时进入methodA,则它将等待直到methodA释放锁定,然后再继续.如果methodA在另一个线程调用时进入methodB,则它将等待直到methodB释放锁定,然后再继续.请注意,methodB调用methodA无关紧要,因为它是相同的锁定this.sync.
没有死锁,它被称为Reentrant Synchronization,如果线程已经获得了锁,它不会被自己阻塞,
想象当你把自己锁在一个房间里,现在你在那个房间和其他被锁住的房间是自由的,你有钥匙或解锁并且从那个房间有门,其他人(线程)想要使用那个房间(方法)被阻止, 不是你