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 @   Draymonder  阅读(233)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· SQL Server统计信息更新会被阻塞或引起会话阻塞吗?
阅读排行:
· 本地部署 DeepSeek:小白也能轻松搞定!
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
· 我们是如何解决abp身上的几个痛点
· 如何基于DeepSeek开展AI项目
点击右上角即可分享
微信分享提示