黑马程序员技术交流社区

标题: 这代码有没有死锁呢? [打印本页]

作者: 黄奇耀    时间: 2012-3-20 09:20
标题: 这代码有没有死锁呢?
大家看看这程序有没有死锁呢?
运行结果为:
if locka
if lockb
else locka
else lockb

package cn.heima.deadlockdemo;

class Test implements Runnable{
        private boolean flag;
        Test(Boolean flag){
                this.flag = flag;
        }
        public void run(){
                if(flag){
                        synchronized(Lock.lockA){
                                System.out.println("if locka");
                                synchronized(Lock.lockB){
                                        System.out.println("if lockb");
                                }
                        }
                } else {
                        synchronized(Lock.lockA){
                                System.out.println("else locka");
                                synchronized(Lock.lockB){
                                        System.out.println("else lockb");
                                }
                        }

                }
        }
}

class Lock{
        static Object lockA = new Object();
        static Object lockB = new Object();
}

public class DeadLockTest {
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                Thread t1 = new Thread(new Test(true));
                Thread t2 = new Thread(new Test(false));
                t1.start();
                t2.start();
        }

}
作者: 马云    时间: 2012-3-20 09:34
没有死锁吧,
你这个可以直看做一个锁
代码一:
synchronized(Lock.lockA){
                                System.out.println("if locka");
                                synchronized(Lock.lockB){
                                        System.out.println("if lockb");
                                }
                        }


代码二:
synchronized(Lock.lockA){
                                System.out.println("else locka");
                                synchronized(Lock.lockB){
                                        System.out.println("else lockb");
                                }
                        }

这两段不可能同时执行的,因为它两用的是一个锁,如果代码块一没执行完,代码块二是不会执行的,所以里边的lock.lockB基本可以不要了没什么用,如果你想要一个死锁呢就这么办
代码一:
synchronized(Lock.lockA){
                                System.out.println("if locka");
                                synchronized(Lock.lockB){
                                        System.out.println("if lockb");
                                }
                        }


代码二:
synchronized(Lock.lockB){
                                System.out.println("else locka");
                                synchronized(Lock.lockA){
                                        System.out.println("else lockb");
                                }
                        }


这个就可以出现死锁了,因为你里边有我的锁我里边有你的锁,当代码一进入到lock.lockA里时停止了,这里代码二进到了lock.lockB里,接下来代码一要进入Lock.lockB但是这个锁在代码二里,代码二没执行完是不会把B锁放出来的,这样就死锁了
作者: 黄奇耀    时间: 2012-3-20 10:04
马云 发表于 2012-3-20 09:34
没有死锁吧,
你这个可以直看做一个锁
代码一:

回答得太好了。{:3_69:}




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