黑马程序员技术交流社区

标题: 关于多线程死锁的问题,求教 [打印本页]

作者: 君子无醉    时间: 2015-5-25 20:40
标题: 关于多线程死锁的问题,求教
这是我写的死锁代码:
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锁对象就可以吗,为什么还牵扯到静态修饰的问题,请大神详细解释一下,谢谢!

作者: l598790586    时间: 2015-5-25 20:55
你这个执行完一次就不执行了,对一些配置还可以的电脑,全部执行完都不死锁都是很正常的事
作者: 君子无醉    时间: 2015-5-25 21:07
l598790586 发表于 2015-5-25 20:55
你这个执行完一次就不执行了,对一些配置还可以的电脑,全部执行完都不死锁都是很正常的事 ...

....但是如果加上static的话  每次执行都是死锁  不加的话 我运行了很多遍 都没有出现死锁问题




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