51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 7416|回复: 4
打印 上一主题 下一主题

[原创] java线程死锁检测方法

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2009-12-16 22:04:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
线程死锁条件
一、理论
线程死锁条件:

1:互斥条件 ,即资源是不能够被共享的。
2:至少有一个进程在使用一个资源却在等待另外一个线程所持有的一个资源
3:资源部能够被进程抢占。
4:必须有循环的等待,永远等待

说白了,就是我要的资源被你锁了,你要的资源被我锁了,所以大家永远僵持谁都动不了
Ex:
下面为死锁的例子
public class DeadLock implements Runnable {


private boolean flag;



static String o1 = new String("str1"), o2 = new String("str2");



public void run() {


System.out.println(flag);


if (flag) {


//
给对象01上锁

synchronized (o1) {


try {


Thread.sleep(500);


} catch (InterruptedException e) {


e.printStackTrace();


}


//
给对象02上锁

synchronized (o2) {


System.out.println("AAA");


}


}



} else {

//
给对象02上锁

synchronized (o2) {


try {


Thread.sleep(500);


} catch (InterruptedException e) {


e.printStackTrace();


}


//
给对象01上锁

synchronized (o1) {


System.out.println("BBB");


}


}



}



}



public static void main(String[] args) {


DeadLock aaa = new DeadLock();


DeadLock bbb = new DeadLock();


aaa.flag = true;


bbb.flag = false;


Thread thA = new Thread(aaa);//
上锁的顺序
o1,o2


Thread thB = new Thread(bbb);//
上锁的顺序
o2,o1


thA.start();


thB.start();


}

}
二、jconsole检查死锁问题
配置
l
JRE
打开:java\jdk1.5.0\jre\lib\management目录,修改management.properties文件
SSL加密:(去掉161行注释)
#For RMI monitoring without SSL use the following line
com.sun.management.jmxremote.ssl=false
无用户密码验证:(去掉203行注释)
# For RMI monitoring without any checking use the following line
com.sun.management.jmxremote.authenticate=false


下面为服务配置

l
tomcat配置:

1. Windows,打开bin/catalina.bat,在doStart后面加上set JAVA_OPTS,端口可以自己设置,例如:

:doStart
shift

set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.port=9393

运行tomcatstartup.bat),查看9393端口是否已经被Java所监听(netstat -ano

2. Linux,打开bin/catalina.sh,在doStart后面加上:

JAVA_OPTS="$JAVA_OPTS "-Dcom.sun.management.jmxremote.port=9393

运行tomcatstartup.sh),查看9393端口是否已经被Java所监听(netstat -tlunp

(!!!注意防火墙是否已打开,可能导致RMI协议无法连接该端口)


l
本地调试配置eclipse
jvm启动参数中,配置
-Dcom.sun.management.jmxremote.port=9393
同时也要设置运行的JRE1.5以上


l
运行jconsole

打开Windows命令行,如果本机上已经装有JDK1.5,并且路径配置正确,直接键入:jconsole
本地系统可以直接连接,远程需要自己输入IP连接




[ 本帖最后由 xiaohanjiang 于 2009-12-16 22:08 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2009-12-17 08:32:26 | 只看该作者
顶一下。学习中。
回复 支持 反对

使用道具 举报

该用户从未签到

3#
发表于 2011-8-6 10:07:42 | 只看该作者
恩,收藏,上次只是简单了在windows界面下用了下,下次再用这个作为指导用用
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2011-8-8 12:10:59 | 只看该作者
本帖最后由 zhang.yuandong 于 2011-8-8 12:12 编辑

回复 3# yzylion
楼上 你是职业PF的吧
回复 支持 反对

使用道具 举报

该用户从未签到

5#
发表于 2011-9-3 16:09:29 | 只看该作者
职业PF是什么?
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-16 09:54 , Processed in 0.077205 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表