日期:2014-05-20  浏览次数:20727 次

关于死锁
看了网上一些关于死锁的例子,写了这么一段代码:
public class ThreadSyn2 implements Runnable {
private static Object obj1 = new Object();
private static Object obj2 = new Object();
/**
 * @param args
 */
public static void main(String[] args) {
ThreadSyn2 ts1 = new ThreadSyn2();
ThreadSyn2 ts2 = new ThreadSyn2();
Thread t1 = new Thread(ts1);
Thread t2 = new Thread(ts2);
t1.setName("theOne");
t2.setName("theTwo");
t1.start();
t2.start();

}

public void run() {
String name = Thread.currentThread().getName();
if (name.equals("theOne")) {
method1(name);
} else {
method2(name);
}

}
private void method1(String name) {
System.out.println(name);
synchronized (obj1) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj2) {
System.out.println(obj2);
}
}
}
private void method2(String name) {
System.out.println(name);
synchronized (obj2) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj1) {
System.out.println(obj1);
}
}
}
}
如果 不带static 关键字,就不会产生死锁,为什么呢?
------解决方案--------------------
因为如果不带static,就是成员属性了,每次new的时候,都会生成一个新的Object obj1 = new Object();
然后线程锁的都是自己对象里的obj,因此不存在锁竞争