死锁小示例与检查方法
2015-07-09 11:13
435 查看
1. 写代码构建个死锁场景; 2. 如何判断程序死锁
好吧,基础知识不牢固,先引入一个链接温故而知新
http://www.360doc.com/content/11/0904/13/834759_145686705.shtml
下面是写的一个demo,和调试的过程,仅供参考
死锁示例代码与main方法
执行加法的线程
main执行结果
卡住不动了,死锁了,检查方式如下
使用jps命令查看当进程号
方法一:
jconsole [pid] 打开如下页面
点击检测死锁,可以看到两个线程栈信息,排查错误
方法二:使用jstack -l [pid] 查看栈信息,可以看到有这样一条内容,能够找到死锁的位置:
简单使用~对于其他排查情况都是类似的,注意检查死锁的几个条件~
好吧,基础知识不牢固,先引入一个链接温故而知新
http://www.360doc.com/content/11/0904/13/834759_145686705.shtml
下面是写的一个demo,和调试的过程,仅供参考
死锁示例代码与main方法
public class DeadLock { private int i; private Object lock1 = new Object(); private Object lock2 = new Object(); public int plus() { synchronized (lock1) { System.out.println("plus get lock1 ... ..."); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock2) { System.out.println("plus get lock2 ... ..."); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } return i++; } } } public int minus() { synchronized (lock2) { System.out.println("minus get lock2 ... ..."); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock1) { System.out.println("minus get lock1 ... ..."); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } return i--; } } } public static void main(String[] args) { DeadLock d = new DeadLock(); TestPlus tp = new TestPlus(d); TestMinus tm = new TestMinus(d); tp.start(); tm.start(); } }
执行加法的线程
public class TestPlus extends Thread { private DeadLock deadLock; @Override public void run() { deadLock.plus(); } public TestPlus(DeadLock deadLock) { this.deadLock = deadLock; } }执行减法的线程
public class TestMinus extends Thread { private DeadLock deadLock; @Override public void run() { deadLock.minus(); } public TestMinus(DeadLock deadLock) { this.deadLock = deadLock; } }
main执行结果
卡住不动了,死锁了,检查方式如下
使用jps命令查看当进程号
方法一:
jconsole [pid] 打开如下页面
点击检测死锁,可以看到两个线程栈信息,排查错误
方法二:使用jstack -l [pid] 查看栈信息,可以看到有这样一条内容,能够找到死锁的位置:
简单使用~对于其他排查情况都是类似的,注意检查死锁的几个条件~
相关文章推荐
- oozie 定时调度时区设置
- 实验室缉毒记之uzgbtymhqo.vbs
- jQuery选择器
- Linux常用命令集合
- struts2(一)---编写第一个struts2项目
- 2.19访问模块(函数或变量)的属性,可以通过句点属性表示法。
- php 工作模式
- JPA下的Hibernate实现一对多级联删除CascadeType.DELETE_ORPHAN
- 为什么很多病毒是用vbs写成的
- Android Service 弹出系统全局Dialog
- IOS开发-UI入门篇
- JSON与XML的区别比较(转载)
- SQL死锁
- Python-PyQt4学习笔记
- Python之获取邮箱邮件
- Nginx服务器限制访问速度的配置方法
- JavaScript学习笔记(一)
- 两种形式的dma 实现memory copy代码
- 2012年5月SAT香港真题解析
- CI扩展支持多级目录