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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 谢洋 高级黑马   /  2013-2-25 09:23  /  1309 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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();
}


4 个回复

正序浏览
这个代码跟死锁没关系。

        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;
该进程就结束了









回复 使用道具 举报
这个问题我以前已接回答过多次了
假设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 10:09
你的程序是正常的从上到下执行完,里面又没有循环,执行完下面的while就没了
没有你说的死循环啊
你的程序 ...

还是不明白
我是这样想的的:
1,t1、t2共享flag标记
2,当flag为ture时,t1执行,只有待到t1把flag改为true时,t2才能执行
3,然后待t2把flag改为true后,t1又开始执行,如此循环
回复 使用道具 举报
你的程序是正常的从上到下执行完,里面又没有循环,执行完下面的while就没了
没有你说的死循环啊
你的程序是执行完了
如果想让他们循环,就在这两个while外面在加个while(true)应该就好了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马