阅读《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对象的锁,才能进入

因此就死锁了

最新文章

  1. android Animation介绍
  2. mybatis多对一关联
  3. Asp.net Json数据解析的一种思路
  4. JAVA类与对象(十)-----抽象类
  5. 从零开始学习jQuery (九) jQuery工具函数
  6. (转) html块级元素和内联元素区别详解
  7. WisDom.Net 框架设计(七) 验证框架
  8. [Git]更新远程代码到本地仓库
  9. ASP.NET MVC Controller接收ajax post方式发送过来的json对象或数组数据
  10. html5 750 REM JS换算方法
  11. SuperSocket学习笔记(二)
  12. rman(上)
  13. Memcache存储大量数据的问题
  14. thrift之TTransport层的内存缓存传输类TMemoryBuffer
  15. Open Judge 2750 鸡兔同笼
  16. Django2.0 正则表示匹配的简单例子
  17. DDL、DML和DCL的区别与理解
  18. 固定footer在底部
  19. aplication.properties配置
  20. 2个Excel表格核对技巧

热门文章

  1. ansible-playbook 案例
  2. 几个关于json序列化 的注解
  3. springboot笔记-文件上传
  4. Ajax提交数据后,清空form表单
  5. mybatis中foreach的用法以及特殊的情况的用法
  6. Python 进阶篇
  7. 外壳程序(shell):命令解释器commond
  8. openlayers之框选放缩DragZoom(vue项目)
  9. python日志汇总
  10. oracle数据库应用总结