A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 祁焱 黑马帝   /  2011-11-2 19:58  /  1528 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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为什么不会产生死锁现象?

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 赞一个!

查看全部评分

1 个回复

倒序浏览
用static 修饰对象程序只创建一个.而这时有两个线程. 相当于两个人抢一双筷子,    (死锁)
没有用static 修饰时 程序会在你new 这个对象时都创建一个, 而这时有两个线程.相当于两个人用两双筷子(不会死锁)
希望对你有帮助

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马