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

  • 相关阅读:
    请求页面
    获取iframe内的元素
    jquery 判断checkbox是否被选中问题
    bootStrap 模板地址
    content
    基于JS的文本验证
    canvas 移动光速特效-
    Swift 语法
    Xcode 8 Swift 类似插件方法
    js整频滚动展示效果(函数节流鼠标滚轮事件)
  • 原文地址:https://www.cnblogs.com/Draymonder/p/11710445.html
Copyright © 2011-2022 走看看