public class DeadLockTest implements Runnable {
private int flag;
static Object o1 = new Object();
static Object o2 = new Object(); public void run() {
if (flag == 1) {
synchronized (o1) {
System.out.println("我在执行1的第一步"); try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2) {
System.out.println("我在执行1的第二步");
}
}
} if (flag == 0) {
synchronized (o2) {
System.out.println("我在执行0的第一步");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
} synchronized (o1) {
System.out.println("我在执行0 的第二步");
}
}
}
} public static void main(String[] args) {
DeadLockTest dlt1 = new DeadLockTest();
DeadLockTest dlt2 = new DeadLockTest();
dlt1.flag = 1;
dlt2.flag = 0;
Thread t1 = new Thread(dlt1);
Thread t2 = new Thread(dlt2);
t1.start();
t2.start();
}
}用来测试死锁的代码。代码本身没问题。执行后会死锁。
但是我想问下如果把
static Object o1 = new Object();
static Object o2 = new Object();
这两行的static去掉。程序就不会死锁了。为什么?
这里静态修饰起什么作用。谢谢

解决方案 »

  1.   

     去掉后 dlt1  dlt2 里的 o1 o2就不相同了静态的是全类一个的去掉后就每个对象一个了
      

  2.   

    static修饰后,对于所有的DeadLockTest对象,都共享o1与o2一个副本,这样o1与o2就成了临界资源。不加static,每个DeadLockTest对象拥有各自的o1与o2副本,不是临界资源,各线程之间并不互斥。
      

  3.   

    去掉static后dlt1.o1和dlt2.o1是俩对象,两把锁互不相干