黑马程序员技术交流社区

标题: 关于死锁程序的疑问 [打印本页]

作者: 王利强    时间: 2012-3-14 16:18
标题: 关于死锁程序的疑问
不多说,先上代码,有几点疑问,当我将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();
        }
}

作者: 泮和顺    时间: 2012-3-14 18:12
死锁也有水产的情况所以输出结果不一样

作者: 贠(yun)靖    时间: 2012-3-14 18:28
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();
        }
}






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