如下代码,应该会 死 锁的,为啥 不会死锁?
public class TestDeadLock implements Runnable
{
    public int flag = 1 ;
    static Object o1 = new Object(),o2 = new Object();
    public void run()
    {
       System.out.println("flag = "+flag);
       if(flag == 1)
       {
          synchronized(o1)
          {
             try
             {
                Thread.sleep(200);
             }
             catch(Exception e)
             {
                e.printStackTrace();
             }
             
          }
          synchronized(o2)
          {
             System.out.println("1");
          }
       }
    
    
    if(flag == 0)
    {
      synchronized(o2)
      {
         try
         {
            Thread.sleep(200);
         }
         catch(Exception e )
         {
           e.printStackTrace();
         }
         synchronized(o1)
         {
          System.out.println("0");
         }
      
      }
    }
  }
    
    public static void main(String[] args)
    {
      TestDeadLock td1 = new TestDeadLock();
      TestDeadLock td2 = new TestDeadLock();
      td1.flag = 1 ;
      td2.flag = 0 ;
      
      Thread t1 = new Thread(td1);
      Thread t2 = new Thread(td2);
      t1.start();
      t2.start();
      
    }
}

解决方案 »

  1.   

    t1.start();
    t2.start();写错了吗?
    t1.run();
    t2.run();
      

  2.   

    楼主让程序再睡长点试试..
    Thread.sleep(1000);
      

  3.   

    Lock都没用,哪来的死锁?
       
      

  4.   

             synchronized(o2)
                    {
                          System.out.println("1");
                    }把上面的代码放在synchronized(o1)代码块里面试试。
      

  5.   

              System.out.println("flag = "+flag);
              if(flag == 1)
              {
                    synchronized(o1)
                    {
                          try
                          {
                                Thread.sleep(200);
                          }
                          catch(Exception e)
                          {
                                e.printStackTrace();
                          }
                          synchronized(o2)     //在synchronized(o1)里面。
                          {
                                System.out.println("1");
                          }
       }
              }
        
        
      

  6.   

    if(flag == 1)
              {
                    synchronized(o1)
                    {
                          try
                          {
                                Thread.sleep(200);
                          }
                          catch(Exception e)
                          {
                                e.printStackTrace();
                          }
                          
                    }
                    synchronized(o2)
                    {
                          System.out.println("1");
                    }
              }
    写错了 
    这样
    if(flag == 1)
              {
                    synchronized(o1)
                    {
                          try
                          {
                                Thread.sleep(200);
                          }
                          catch(Exception e)
                          {
                                e.printStackTrace();
                          }
                          
                    
                          synchronized(o2)
                         {
                               System.out.println("1");
                         }                }
              估计会死
      

  7.   


    if (flag == 1) {
    synchronized (o1) {
    try {
    Thread.sleep(200);
    } catch (Exception e) {
    e.printStackTrace();
    } synchronized (o2) {
    System.out.println("1");
    }
    }
    }
      

  8.   


    哥们儿 别人用的是线程 当然是用start();
    如果用run的话只是单纯的调用方法 没有多线程的作用