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对象的锁,才能进入
因此就死锁了

posted @ 2019-10-20 22:20  Draymonder  阅读(233)  评论(0编辑  收藏  举报