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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗宵 中级黑马   /  2012-7-26 20:33  /  1400 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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里面线程为什么可以直接去走第二个锁

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
在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你等我,我等你,程序陷入死锁

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

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
肖琦 发表于 2012-7-26 20:51
在while循环的上半段中,t1或t2必然有一个首先持有locka的内部锁,设为x1,此时另外一个(设为x2)线程阻塞 ...

嗯,,谢谢咯,
回复 使用道具 举报
        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");
                }
                }
        }

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
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也没释放锁,所以谁也进不去了
//造成了死锁

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

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