public class ThreadDeadLock implements Runnable {
public int flag = 1;
static Object o1 = new Object(), o2 = new Object(); public void run() {
System.out.println("flag = " + flag);
if (flag == 1) {
synchronized(o1) {
try {
Thread.sleep(1000);
}catch(Exception ie) {
ie.printStackTrace();
}

synchronized(o2) {
System.out.println("1");
}
}
}

if (flag == 0) {
synchronized(o2) {
try {
Thread.sleep(1000);
}catch(Exception ie) {
ie.printStackTrace();
}
synchronized(o1) {
System.out.println("0");
}
}
}
}

public static void main(String[] args) {
ThreadDeadLock tdl1 = new ThreadDeadLock();
ThreadDeadLock tdl2 = new ThreadDeadLock();
Thread t1 = new Thread(tdl1);
Thread t2 = new Thread(tdl2);
tdl1.flag = 1;
tdl2.flag = 0;
t1.start();
t2.start();
}
} 这是个线程死锁程序, 为什么要在程序的第3行加上static 关键字, 如果不加,则不会发生线程死锁? 难道线程死锁问题都一定要加上static关键字吗?  小弟是Java新手, 还请大侠们, 高手们帮我看看这程序, 在这先谢了!!!!

解决方案 »

  1.   

    不加static的时候,你每次启动一个新的线程,都会new出来两个object对象,所以无论多少个线程他们所获取的对象锁都是不相同的,不会产生同步也就不会产生死锁。
      

  2.   

    不使用static当然也可以产生死锁,只要把两个对象通过构造方法传入即可public class ThreadDeadLock implements Runnable {
    private int flag ;
    private Object o1 ;
    private Object o2 ;

    public ThreadDeadLock(int flag, Object o1, Object o2) {
    super();
    this.flag = flag;
    this.o1 = o1;
    this.o2 = o2;
    } public void run() {
    System.out.println("flag = " + flag);
    if (flag == 1) {
    synchronized (o1) {
    try {
    Thread.sleep(300);
    } catch (Exception ie) {
    ie.printStackTrace();
    } synchronized (o2) {
    System.out.println("1");
    }
    }
    } if (flag == 0) {
    synchronized (o2) {
    try {
    Thread.sleep(300);
    } catch (Exception ie) {
    ie.printStackTrace();
    }
    synchronized (o1) {
    System.out.println("0");
    }
    }
    }
    } public static void main(String[] args) {
    Object o1 = new Object();
    Object o2 = new Object();
    ThreadDeadLock tdl1 = new ThreadDeadLock(1,o1,o2);
    ThreadDeadLock tdl2 = new ThreadDeadLock(0,o1,o2);
    Thread t1 = new Thread(tdl1);
    Thread t2 = new Thread(tdl2);
    t1.start();
    t2.start();
    }
    }
    输出结果:
    flag = 1
    flag = 0
    ....然后死锁