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] 查看栈信息,可以看到有这样一条内容,能够找到死锁的位置:
简单使用~对于其他排查情况都是类似的,注意检查死锁的几个条件~