黑马程序员技术交流社区

标题: 代码锁死分析:以下代码是怎么锁死? [打印本页]

作者: 谢洋    时间: 2013-2-25 09:23
标题: 代码锁死分析:以下代码是怎么锁死?
package test1;
//代码锁死分析:以下代码是怎么锁死?
class  DeadLockTest
{
        public static void main(String[] args) throws InterruptedException
        {
        
               Thread t1 = new Thread(new Test(true));
                Thread t2 = new Thread(new Test(false));
                t1.start();
                t2.start();
               
               
        }
}

class Test implements Runnable
{
        private static   boolean flag;
      
        Test(boolean flag)
        {
                this.flag = flag;
            

        }

        public void run()
        {
               
               
                        while(flag)
                        {
                                synchronized(MyLock.locka)
                                {
                                        System.out.println(Thread.currentThread().getName()+"...if locka ");
                                        synchronized(MyLock.lockb)
                                        {
                                                System.out.println(Thread.currentThread().getName()+"..if lockb");                                       
                                        }
                                       
                                   
                                }
                              

                                flag=false;
                              

                        }
               
              
                        while(!flag)
                        {
                                synchronized(MyLock.lockb)
                                {
                                        System.out.println(Thread.currentThread().getName()+"..else lockb");
                                        synchronized(MyLock.locka)
                                        {
                                                System.out.println(Thread.currentThread().getName()+".....else locka");
                                        }
                                   

                                }

                                flag=true;
                                
                        }
               
        }
}


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



作者: 胥文    时间: 2013-2-25 10:09
你的程序是正常的从上到下执行完,里面又没有循环,执行完下面的while就没了
没有你说的死循环啊
你的程序是执行完了
如果想让他们循环,就在这两个while外面在加个while(true)应该就好了
作者: 谢洋    时间: 2013-2-25 12:18
胥文 发表于 2013-2-25 10:09
你的程序是正常的从上到下执行完,里面又没有循环,执行完下面的while就没了
没有你说的死循环啊
你的程序 ...

还是不明白
我是这样想的的:
1,t1、t2共享flag标记
2,当flag为ture时,t1执行,只有待到t1把flag改为true时,t2才能执行
3,然后待t2把flag改为true后,t1又开始执行,如此循环
作者: 偏執旳、靑春    时间: 2013-2-25 13:30
这个问题我以前已接回答过多次了
假设t1先运行,t1运行到System.out.println(Thread.currentThread().getName()+"...if locka ");时。
t2又运行了,t2运行System.out.println(Thread.currentThread().getName()+"..else lockb");
因为t1没运行完,那么MyLock.locka无法释放,刚好t2需要他t2就不动了在等他,但是t1需要MyLock.lockb才能继续走,
而t2又不能给,所以二者相持不下,导致了死锁。
一直在里面等着,彼此看谁先动
作者: 宋蓬勃    时间: 2013-2-25 13:35
这个代码跟死锁没关系。

        Thread t1 = new Thread(new Test(true));
       Thread t2 = new Thread(new Test(false));
程序运行到这里flag = fales;
t1、t2中的一个先运行,打印   
...else  lockb
...else  locka
然后  flag = true;
该进程就结束了
另一个进程先打印
...if locka
...if lockb
flag = fales;
然后打印
...else  lockb
...else  locka
然后  flag = true;
该进程就结束了














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