zoukankan      html  css  js  c++  java
  • 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对象的锁,才能进入
    因此就死锁了

  • 相关阅读:
    卸载office密钥的命令
    断言的使用
    stm32的NVIC是什么?
    STM32 Cube mx 安装
    不用移位计算获得高位数据
    分组数据
    Vue Router
    存储过程
    js 中 json.stringfy()将对象、数组转换成字符串
    js中 json对象的转化 JSON.parse()
  • 原文地址:https://www.cnblogs.com/Draymonder/p/11710445.html
Copyright © 2011-2022 走看看