死锁小示例与检查方法

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] 查看栈信息,可以看到有这样一条内容,能够找到死锁的位置:


简单使用~对于其他排查情况都是类似的,注意检查死锁的几个条件~

阅读更多
个人分类: 基础 多线程
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭