Java 内置锁 重入问题
阅读《Java并发编程实战》,遇到了一个问题
代码如下
/**
* @auther draymonder
*/
public class Widget {
public synchronized void doingSomething() {
System.out.println("fa");
}
}
class LoggingWidget extends Widget {
@Override
public synchronized void doingSomething() {
System.out.println("son");
this.doingSomething1();
super.doingSomething();
}
public synchronized void doingSomething1() {
System.out.println("2333");
}
}
然后书上写 如果内置锁不可重入,那么将会发生死锁。
百思不得其解
其实是很久没写Java了
synchronized
本身如果锁非静态方法的话,其实是锁的对象,那就很显然了
如果这个sync锁是不可重入的,那么 我new LoggingWidget()
然后调用something()
,就会发生子类的这个doingSomething()
方法已经锁住了this 对象
由于不可重入,那么doingSomething1()
和super.doingSomething()
就会发现进入的时候,需要锁this对象,但是此时this对象已经被子类的 something()
给锁住了
因此 doingSomething1()
和super.doingSomething()
就不得不等doingSomething()
方法释放this对象的锁,才能进入
因此就死锁了