黑马程序员技术交流社区

标题: 关于死锁的一个问题 [打印本页]

作者: 祁焱    时间: 2011-11-2 19:58
标题: 关于死锁的一个问题
public class DeadLockTest {

    public static void main(String[] args) {
        Thread t1 = new Thread(new Test(true));
        Thread t2 = new Thread(new Test(false));
        t1.start();
        t2.start();
    }
}
class MyLock
{
         //static MyLock lock1=new MyLock();
         //static MyLock lock2=new MyLock();

}

class Test implements Runnable {

    MyLock lock1=new MyLock();//加static就会死锁
    MyLock lock2=new MyLock();//加static就会死锁

    private boolean flag;
    Object obj1 = new Object();
    Object obj2 = new Object();

    public Test(boolean flag) {
        this.flag = flag;
    }

    public void run() {
        if (flag) {
            while (true) {
                synchronized (lock1) {
                    System.out.println("if lock1");
                    synchronized (lock2) {
                        System.out.println("if lock2");
                    }
                }
            }
        } else {
            while (true) {
                synchronized (lock2) {
                    System.out.println("else lock2");
                    synchronized (lock1) {
                        System.out.println("else lock1");
                    }
                }
            }
        }
    }
}
我想问一下以上程序为什么在注释处加static才会产生死锁,不加static为什么不会产生死锁现象?
作者: 柴永菲    时间: 2011-11-4 19:26
用static 修饰对象程序只创建一个.而这时有两个线程. 相当于两个人抢一双筷子,    (死锁)
没有用static 修饰时 程序会在你new 这个对象时都创建一个, 而这时有两个线程.相当于两个人用两双筷子(不会死锁)
希望对你有帮助




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2