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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 贾飞雨 中级黑马   /  2012-6-27 22:12  /  1687 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 yufeiant 于 2012-6-27 23:56 编辑

class Test implements Runnable
{

private boolean flag;
Test(boolean flag)
{
this.flag=flag;
}
public void run()
{
if (flag)
{
while(true){

synchronized(Look.looka)
{
System.out.println("if a");
synchronized(Look.lookb)
{
System.out.println("if b");

                                }
                        }
                }

}
else
{
while(true){
synchronized(Look.looka)
{
System.out.println("else a");
synchronized(Look.lookb)
{
System.out.println("else b");

}
}
}
}
}
}
  
class Look
{
static Object looka=new Object();
static Object lookb=new Object();
}


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

t2.start();
}
}
//为什么死锁锁不呢??好纠结

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
这样写就对了..
class Test implements Runnable
{
    private boolean flag;
    Test(boolean flag)
   {
             this.flag=flag;
   }
    public void run()
   {
        if (flag)
        {
            while(true){
                     synchronized(Look.looka)
                      {
                          System.out.println("if a");
                           synchronized(Look.lookb)
                           {
                                     System.out.println("if b");
                            }
                   }
              }
        }
        else
       {
           while(true){
            synchronized(Look.looka)//这改成synchronized(Look.lookb)
             {
                   System.out.println("else a");
                   synchronized(Look.lookb)//这儿改成 synchronized(Look.looka)
                  {
                         System.out.println("else b");
                   }
               }
          }
       }
   }
}
class Look
  {
         static Object looka=new Object();
         static Object lookb=new Object();
   }
  class  DeadLookDemo
  {
           public static void main(String[] args)
       {
            Thread t1=new Thread(new Test(true));
             t1.start();
            Thread t2=new Thread(new Test(false));
            t2.start();
       }
}

死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止..
回复 使用道具 举报
还是死锁不了啊  
回复 使用道具 举报
else
{
while(true){
synchronized(Look.looka)
{
System.out.println("else a");
synchronized(Look.lookb)
{
System.out.println("else b");
}
将红色部分的两句话对调即可,程序运行会被阻塞,死锁锁了

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

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