黑马程序员技术交流社区

标题: 请教高手们看一下这段代码多线程死锁效果怎么回事? [打印本页]

作者: ckkele    时间: 2014-8-18 22:26
标题: 请教高手们看一下这段代码多线程死锁效果怎么回事?
class SiSuo implements Runnable
{
Object a=new Object();
Object b=new Object();
Object c=new Object();
boolean flog=true;
public void run()
{
  if(flog)
  {
   while(true)
   {
    synchronized(a)
     {
     System.out.println(Thread.currentThread().getName()+"此处是a锁...");
      synchronized(b)
      {
       System.out.println(Thread.currentThread().getName()+"此处是b锁....");
        synchronized(c)
         {
         System.out.println(Thread.currentThread().getName()+"此处是c锁....");
         }
      }
     }
  
   }
  }
  else
{
  while(true)
  {
   synchronized(b)
    {
     System.out.println(Thread.currentThread().getName()+"此处是b锁...");
     synchronized(a)
     {
      System.out.println(Thread.currentThread().getName()+"此处是a锁...");
      synchronized(c)
      {
      System.out.println(Thread.currentThread().getName()+"此处是c锁....");
      }
     }
    }
  }
}
  
}
}
class  DeadLock
{
public static void main(String[] args)
{
  SiSuo s=new SiSuo();
  Thread f=new Thread(s);
  Thread f1=new Thread(s);
  f.start();       //放在此处前同样可以发生死锁
  try{sleep(1);}catch(Exception e){}    //请教此处让0线程睡眠顺序是否有区别
  s.flog=false;   
  f1.start();   //放在此处前同样可以发生死锁
}
}



请教高手们,  try{sleep(1);}catch(Exception e){} 让0线程睡眠如果放在f.start(); 前面编译执行后结果也能发生死锁,放在s.flog=false; 与 f1.start(); 中间编译执行后结果同样也能发生死锁,疑惑的是让线程睡眠放置的顺序区别点是在哪里呢?

作者: ckkele    时间: 2014-8-19 22:49
:( 我是菜鸟额  有没有大神指教一下




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