您的位置:首页 > 其它

死锁小示例与检查方法

2015-07-09 11:13 435 查看
1. 写代码构建个死锁场景; 2. 如何判断程序死锁

好吧,基础知识不牢固,先引入一个链接温故而知新
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] 查看栈信息,可以看到有这样一条内容,能够找到死锁的位置:



简单使用~对于其他排查情况都是类似的,注意检查死锁的几个条件~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: