死锁小示例与检查方法

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


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

相关文章推荐

关于数据库死锁的检查方法

 关于数据库死锁的检查方法 一、        数据库死锁的现象 程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错。 二、        死锁的原理 当对于数据库某个表的某...

教您如何检查oracle死锁

  • 2012年01月06日 20:38
  • 108KB
  • 下载

Java 死锁示例性源代码

  • 2010年01月26日 15:19
  • 6KB
  • 下载

windbg的使用四(Windbg检查死锁 )

windbg的使用四(Windbg检查死锁 )   2011-10-14 14:29:44|  分类: windbg用法|举报|字号 订阅        死锁问...

并发(九):检查死锁与Locked ownable synchronizers

通过jstack可快速检查线程的死锁信息,用法如下:# 获取JVM ID(JAVA 进程ID),通过参数lv可以获取更详细的JAVA方法调用信息 jps -lv # 得到JVM ID后,执行jstac...
  • yiifaa
  • yiifaa
  • 2017年07月24日 11:27
  • 534

v利用sys.sysprocesses检查SqlServer的阻塞和死锁 .

视图中主要的字段:  1. Spid:Sql Servr 会话ID  2. Kpid:Windows 线程ID  3. Blocked:正在阻塞求情的会话 ID。如果此列为 Null,则标识请求...
  • tearsmo
  • tearsmo
  • 2014年11月14日 16:21
  • 1415

进程的死锁及其预防,检查,恢复

转自:http://www.mmrtvu.gd.cn/grzy/os/jiaoxue/jiaocai801.htm#jiaocai81 一、要点提示 (1) 掌握死锁的概念和产生死锁的根本原因...

SQL Server 检查死锁

找出什么被锁定了 系统的反应迟缓意味着你应该做一些调查了。你的查找最好从测定系统发生锁定的数量和频率开始。如果你的系统环境处理事务性很高的话,这样各个应用程序争夺资源就会很常见,从而引起锁定。解决这...

用 sys.sysprocesses 检查 Sql Server的阻塞和死锁

Sys.SysProcesses 系统表是一个很重要的系统视图,主要用来定位与解决Sql Server的阻塞和死锁。 MSDN:包含正在 SQL Server 实例上运行的进程的相关信息。这...
  • wxzyq
  • wxzyq
  • 2011年11月13日 10:24
  • 555

SQL Server 检查和处理死锁问题

-- 检查锁定表 select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName  from...
  • DJ2008
  • DJ2008
  • 2014年09月23日 18:56
  • 1282
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:死锁小示例与检查方法
举报原因:
原因补充:

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