|
线程死锁条件
一、理论
线程死锁条件:
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
运行tomcat(startup.bat),查看9393端口是否已经被Java所监听(netstat -ano)
2. Linux,打开bin/catalina.sh,在doStart后面加上:
JAVA_OPTS="$JAVA_OPTS "-Dcom.sun.management.jmxremote.port=9393
运行tomcat(startup.sh),查看9393端口是否已经被Java所监听(netstat -tlunp)
(!!!注意防火墙是否已打开,可能导致RMI协议无法连接该端口)
l
本地调试配置eclipse
在jvm启动参数中,配置
-Dcom.sun.management.jmxremote.port=9393
同时也要设置运行的JRE为1.5以上
l
运行jconsole:
打开Windows命令行,如果本机上已经装有JDK1.5,并且路径配置正确,直接键入:jconsole
本地系统可以直接连接,远程需要自己输入IP连接
[ 本帖最后由 xiaohanjiang 于 2009-12-16 22:08 编辑 ] |
|