黑马程序员技术交流社区

标题: 死锁 [打印本页]

作者: 罗宵    时间: 2012-7-26 20:33
标题: 死锁
public class DeadLock implements Runnable {
        Object locka=new Object();
        Object lockb=new Object();
        @Override
        public void run() {
        while(true){
                synchronized (locka) {
                        System.out.println("11locka");
                        synchronized (lockb) {
                                System.out.println("11lockb");
                        }
                }
                synchronized (lockb) {
                System.out.println("22lockb");
                synchronized (locka) {
                        System.out.println("22locka");
                }
                }
        }

        }
}

public class Test {

        public static void main(String[] args) {
                DeadLock dk=new DeadLock();
                Thread t1=new Thread(dk,"aa");
                Thread t2=new Thread(dk,"bb");
                t1.start();
                t2.start();       
        }
}
这样也可以死锁,但是在while里面线程为什么可以直接去走第二个锁
作者: 肖琦    时间: 2012-7-26 20:51
在while循环的上半段中,t1或t2必然有一个首先持有locka的内部锁,设为x1,此时另外一个(设为x2)线程阻塞,由于lockb没有被锁定,
x1继续持有lockb的内部锁,然后分别出了两个synchronized 语句块,即分别释放了lockb和locka的内部锁。
现在,x1即将进入下半段程序,此时,如果x2持有了上半段locka的锁,x1持有了下半段lockb的锁,
则:x2继续试图持有上半段的lockb的锁,x1继续试图持有下半段locka的锁,但是locka,lockb现在分别被x2,x1持有,于是x1,x2你等我,我等你,程序陷入死锁

希望对你有帮助.....

作者: 罗宵    时间: 2012-7-26 21:31
肖琦 发表于 2012-7-26 20:51
在while循环的上半段中,t1或t2必然有一个首先持有locka的内部锁,设为x1,此时另外一个(设为x2)线程阻塞 ...

嗯,,谢谢咯,
作者: 淡然    时间: 2012-7-26 22:04
        public void run() {
        while(true){
                synchronized (locka) {//假设t1得到locka,则t2等待locka
                        System.out.println("11locka");
                        synchronized (lockb) {//t1得到lockb,并释放locka,t2有可能得到locka,并在此等待lockb被释放
                                System.out.println("11lockb");
                        }
                }
                synchronized (lockb) {//t1持有lockb继续执行   
             System.out.println("22lockb");
                synchronized (locka) {//此时t1等待locka被释放,t2则继续等待lockb被释放   
                    System.out.println("22locka");
                }
                }
        }


作者: 刘海源    时间: 2012-7-26 22:07
class DeadLock implements Runnable {
        Object locka = new Object();
        Object lockb = new Object();

        @Override
        public void run() {
                while (true) {
                        synchronized (locka) {
                                System.out.println("11locka");
                                synchronized (lockb) {
                                        System.out.println("11lockb");
                                }
                        }
                        synchronized (lockb) {
                                System.out.println("22lockb");
                                synchronized (locka) {
                                        System.out.println("22locka");
                                }
                        }
                }

        }
}

public class Test {

        public static void main(String[] args) {
                DeadLock dk = new DeadLock();
                Thread t1 = new Thread(dk, "aa");
                Thread t2 = new Thread(dk, "bb");
                t1.start();
                t2.start();
        }
}
//因为你创建了两个线程,而且每个线程都有各自的锁,同时呢他们都有执行资格和但是
//执行权是谁的呢CUP说了算,当线程t1拿着locka锁进入后打印出了11locka但是locka并没有释放锁
//如果是理想情况下就接着就拿着锁lockb进入打印出11lockb
//但是CUP给谁执行权是随机的如果当拿着locka锁打印了11locka后但没释放锁,又线程t2获得了执行权
//那么打印出了22lockb当进如locka时因为没有锁所以进不去了,同样lockb也没释放锁,所以谁也进不去了
//造成了死锁




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