public class TestDeadLock implements Runnable
{
public int flag=1;
static Object o1=new Object();
static Object o2=new Object();public void run()
{

      if(flag==1){
synchronized (o1){
try
                  {
            Thread.sleep(100);
           }
catch(Exception e){}
         }
synchronized (o2)
                    {
System.out.println("flag==1");
            }
}       if(flag==0){
synchronized (o2)
               {
try{
Thread.sleep(100);
   }
catch(Exception e)
{}
}
synchronized (o1){
System.out.println("flag==2");
}
      }
}
public static void main(String[] args)
{
TestDeadLock te1=new TestDeadLock();
TestDeadLock te2=new TestDeadLock();
te1.flag=1;
te2.flag=0;
Thread t1 = new Thread(te1);
Thread t2 = new Thread(te2);
t1.start();
t2.start();
}
}
我是这么想的:t1线程先启动因为flag==1所以应该先锁住o1,睡眠。然后t2启动flag==2锁住o2,然后t1醒来,但o2被锁定。所以无法进入下面被锁定的代码块。同理t2也无法继续进行。
但我试着怎么最后可以打印出结果:flag==1
flag==2

解决方案 »

  1.   

    在对象方法(非静态方法)中对静态变量(类变量)做同步是无效的. 你改成run中调用一个静态方法,并在静态方法里面做同步试试.
      

  2.   

    新手上路,研究了下没有解决,期待高手。学习ing
      

  3.   

    你这个已经是个死锁了,当打印出flag==1 flag==2后两个就锁死在那里了,如果不是死锁的话它会继续打印的
      

  4.   

    总感觉代码什么地方不对!!, 我想应该是没有达成死锁的条件, 先thread 1执行完后在等待o2时,已经跳出了o1的同步代码块,这时o1已经释放, 然后Thread2在等待o1时也跳出了o2的同步代码块,这样写是不会造成死锁的
      

  5.   

    搞错了……synchronized (o1){ synchronized (o2){ }}
    synchronized (o2){ synchronized (o2){ }}这样才可以