死锁小示例与检查方法

原创 2015年07月09日 11:13:18

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


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

死锁的检测和解除

死锁的检测和解除
  • sinat_22055459
  • sinat_22055459
  • 2016年05月19日 15:55
  • 3059

线程死锁检测方法

当多条线程以不同的顺序抢占同步资源的时候,就有可能发生死锁。可通过jstack分析堆栈信息或者采用JConsole工具来帮助我们快速找到发生死锁的根源。...
  • littleschemer
  • littleschemer
  • 2015年08月12日 20:04
  • 5533

【操作系统】处理死锁的方法

破坏死锁的四个必要条件中的一个或几个。预防死锁 破坏互斥条件 破坏请求和保持条件 破坏不可剥夺条件 破坏环路等待条件 破坏互斥条件即允许多个进程同时访问资源。但由于资源本身固有特性的限制,此方法不可行...
  • qq_28602957
  • qq_28602957
  • 2016年12月07日 17:09
  • 2284

linux死锁检测的一种思路

linux死锁检测的一种思路 http://www.cnblogs.com/mumuxinfei/p/4365697.html 前言:    上一篇博文讲述了pstack的使用和原理...
  • zdy0_2004
  • zdy0_2004
  • 2015年03月26日 16:58
  • 5853

Java死锁的排查

先弄个死锁的代码例子: public class DeadLock implements Runnable { private int flagCurrent = -1; private s...
  • sidihuo
  • sidihuo
  • 2016年09月08日 19:12
  • 1268

sqlserver检查死锁的sql

select a.spid blocking_spid,a.blocked,c.text blocking_text,d.text blocked_text from sys.sysprocesses...
  • wem520
  • wem520
  • 2014年12月31日 15:42
  • 2790

浅谈死锁破除和优化

浅谈死锁优化
  • lonelyrains
  • lonelyrains
  • 2016年03月06日 21:42
  • 1628

死锁产生的原因和必要条件及预防死锁的方法及死锁的检测与解除

产生死锁的原因和必要条件: 产生死锁的原因: 1.竞争资源。当系统中供多个进程共享的资源如打印机,公用队列等,其数目不足以满足诸进程的需要时,会引起诸进程对资源的竞争而产生死锁。 2.进程推...
  • wangiijing
  • wangiijing
  • 2016年07月17日 00:01
  • 4446

浅谈Linux死锁检测

浅谈Linux死锁检测
  • baidu_35534327
  • baidu_35534327
  • 2016年10月25日 21:37
  • 435

MySQL死锁问题分析

线上某服务时不时报出如下异常(大约一天二十多次):“Deadlock found when trying to get lock;”。 Oh, My God! 是死锁问题。尽管报错不多,对性能目前看...
  • mysqldba23
  • mysqldba23
  • 2017年03月24日 14:09
  • 192
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:死锁小示例与检查方法
举报原因:
原因补充:

(最多只允许输入30个字)