死锁原因

Java发生死锁的根本原因是:在申请锁时发生了交叉闭环申请。即线程在获得了锁A并且没有释放的情况下去申请锁B,这时,另一个线程已经获得了锁B,在释放锁B之前又要先获得锁A,因此闭环发生,陷入死锁循环。

监控死锁

VisualVM监控工具有明显线程死锁提醒,也可监控到发生死锁的线程、类、代码行数、数据类型。

分析死锁

  1. VisualVM生成threaddump,查找死锁代码块内存地址

  2. VisualVM生成heapdump, 使用OQL查看被死锁对象的值和引用
select heap.findObject("0x00000006c0276428")

  1. 使用OQL的另一种方法
jmap -dump:live,file=/data/test.map <jps端口号>
jhat /data/test.map
浏览器访问 http://ip:7000/



示例代码

/*
* 线程死锁等待演示
*/
static class SynAddRunalbe implements Runnable {
int a, b; public SynAddRunalbe(int a, int b) {
this.a = a;
this.b = b;
}
@Override
public void run() {
synchronized (Integer.valueOf(a)) {
synchronized (Integer.valueOf(b)) {
System.out.println(a + b);
}
}
} public static void main(String[] args) throws Exception {
for (int i=0;i< 100; i++) {
new Thread(new SynAddRunalbe(1, 2)).start();
new Thread(new SynAddRunalbe(2, 1)).start();
}
}

扫一扫,关注我

最新文章

  1. [SE0]简单的搜索引擎原理
  2. HTML5视频Video 音频Audio
  3. ThinkBox DOC
  4. SQLite介绍、学习笔记、性能测试
  5. AE+C# 向axPageLayoutControl1添加图例
  6. HDU1429+bfs+状态压缩
  7. [Unity3d]小地图的制作
  8. Oracle 设置日志模式
  9. group By 和 Union 、 Union all的用法
  10. 利用Rsync在windows和linux之间同步数据
  11. 区块链入门(1):搭建(Ubuntu系统)Truffle v3.2.1 开发和测试环境
  12. Git服务搭建及github使用教程
  13. 洛谷 P3455&amp;BZOJ1101 【[POI2007]ZAP-Queries】
  14. ES6常用语法(下)
  15. Wechart 饼图
  16. Linux&amp;Windows中VNC协议及使用方法
  17. c++中友元机制
  18. js-ES6学习笔记-Generator函数的应用
  19. Amazon电商数据分析——数据获取
  20. [ios]iOS8 定位

热门文章

  1. 记一次磁盘UUID不能识别故障处理
  2. 如何使用 Python 進行字串格式化
  3. Python-类属性查询协议-__getattr__ __getattribute__
  4. 给select赋值的一种方法
  5. 【Python】使用Python解释器
  6. 003 01 Android 零基础入门 01 Java基础语法 01 Java初识 03 Java程序的执行流程
  7. c++中的#include &quot;stdafx.h&quot;
  8. Unicode、UTF8、GB2312、ANSI
  9. 《C++primerplus》第9章练习题
  10. OneWire总线的Arduino库函数