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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄奇耀 中级黑马   /  2012-3-20 09:20  /  1832 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

大家看看这程序有没有死锁呢?
运行结果为:
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();
        }

}

2 个回复

倒序浏览
没有死锁吧,
你这个可以直看做一个锁
代码一:
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锁放出来的,这样就死锁了

评分

参与人数 1技术分 +2 收起 理由
职业规划-刘倩老师 + 2 赞一个!

查看全部评分

回复 使用道具 举报
马云 发表于 2012-3-20 09:34
没有死锁吧,
你这个可以直看做一个锁
代码一:

回答得太好了。{:3_69:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马