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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

这是我写的死锁代码:
package dieLock;

public class DieLock extends Thread {
        private boolean flag;
        private   Object obj1 = new Object();
        private   Object obj2 = new Object();

        public DieLock(boolean flag) {
                this.flag = flag;
        }
@Override
        public void run() {
                if (flag) {
                        synchronized (obj1) {
                                System.out.println("if obj1");
                                synchronized (obj2) {
                                        System.out.println("if obj2");
                                }
                        }
                } else {
                        synchronized (obj2) {
                                System.out.println("else obj2");
                                synchronized (obj1) {
                                        System.out.println("else obj1");
                                }
                        }
                }
        }

}


package dieLock;

public class DieLockDemo {
        public static void main(String[] args){
                DieLock lock1=new DieLock(true);
                DieLock lock2=new DieLock(false);
                lock1.start();
                lock2.start();
        }
}

以上代码,如果允许DieLockDemo的话,不会出现死锁问题(反复刷新,运行了很多遍),如果将        private   Object obj1 = new Object(); private   Object obj2 = new Object();加上静态修饰符修饰的话,private  static Object obj1 = new Object(); private staitc  Object obj2 = new Object(); 就会很容易出现死锁问题,请问大神为什么会这样 加上静态和不加静态为什么差别会那么大,synchronized不是传一个任意Object锁对象就可以吗,为什么还牵扯到静态修饰的问题,请大神详细解释一下,谢谢!

2 个回复

正序浏览
l598790586 发表于 2015-5-25 20:55
你这个执行完一次就不执行了,对一些配置还可以的电脑,全部执行完都不死锁都是很正常的事 ...

....但是如果加上static的话  每次执行都是死锁  不加的话 我运行了很多遍 都没有出现死锁问题
回复 使用道具 举报

回帖奖励 +1

你这个执行完一次就不执行了,对一些配置还可以的电脑,全部执行完都不死锁都是很正常的事
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马