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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王利强 中级黑马   /  2012-3-14 16:18  /  1441 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

不多说,先上代码,有几点疑问,当我将if语句写为if(flag)或if(flag==true)时,运行结果均为if  locka与else lockb,即发生死锁。而当我将if语句写为if(flag=true)时,运行结果却为if locka ; if  lockb;if locka;if lockb,这是为什么呢?
class test implements Runnable
{        private boolean flag;
        test(boolean flag)
                {
                        this.flag=flag;
                }
        public void run()
        {
                if(flag==true)
                        {
                                synchronized(lock.locka)
                                {        System.out.println("if locka");
                                        synchronized(lock.lockb)
                                        {
                                        System.out.println("if lockb");
                                        }
                                }
                        }
                else
                                {synchronized(lock.lockb)
                                {        System.out.println("else lockb");
                                        synchronized(lock.locka)
                                        {
                                        System.out.println("else locka");
                                        }
                                }
                                }
        }

}
class lock
{        static Object locka=new Object();
        static Object lockb=new Object();
        }


class  DeathDemo
{
        public static void main(String[] args)
        {
                Thread t1=new Thread(new test(true));
                Thread t2=new Thread(new test(false));
                t1.start();
                t2.start();
        }
}

2 个回复

倒序浏览
死锁也有水产的情况所以输出结果不一样
回复 使用道具 举报
class test implements Runnable
{        private boolean flag;
        test(boolean flag)
                {
                        this.flag=flag;
                }
        public void run()
        {
                if(flag==true)   // 初始化Test的时候给flag赋值了  1--true  2---false  启动线程 调用run方法  假设1线程执行到这句了,判断flag==true  结果范围true那么就会运行if中的语句,对吧,又假设1线程执行到if中的第一个锁中   locka就为关闭状态了,而1线程在这放弃执行权   换2线程来,false==true返回时false所以就运行else中的代码
也假设2线程执行到else里面的第一个锁里面就停止,这时候lockb 就为关闭状态,对吧。  那么现在不管执行1 还是2 线程都不能进入内层的锁了   因为都是处于关闭状态
   所以你这样写也一样可以造成死锁的,至于出现逆那种情况就是不属于 我假设的这种了  才会输出不同的结果  毕竟线程是随机的啊  不可能结果都一样的
   
           而你把flag=true  这是赋值语句  不管前面初始什么结果  最后又给flag重新赋值为true了  所以你不管怎么运行结果都一样了
                        {
                                synchronized(lock.locka)
                                {        System.out.println("if locka");
                                        synchronized(lock.lockb)
                                        {
                                        System.out.println("if lockb");
                                        }
                                }
                        }
                else
                                {synchronized(lock.lockb)
                                {        System.out.println("else lockb");
                                        synchronized(lock.locka)
                                        {
                                        System.out.println("else locka");
                                        }
                                }
                                }
        }

}
class lock
{        static Object locka=new Object();
        static Object lockb=new Object();
        }


class  DeathDemo
{
        public static void main(String[] args)
        {
                Thread t1=new Thread(new test(true));
                Thread t2=new Thread(new test(false));
                t1.start();
                t2.start();
        }
}

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