public class Test {    
  static Object o1 = new Object();
   static Object o2 = new Object();
    
    public static void main(String[] args) {
         
         synch synch1 = new synch();
         synch synch2 = new synch();
         synch1.a=0;
         synch2.a=2;
         Thread t1 = new Thread(synch1);
         Thread t2 = new Thread(synch2);
         t1.start();
         t2.start();
    }
   
        
   }
class synch implements Runnable{
    
    int a;
    public void run() {
        System.out.println(a);
        if(a == 0){
          try {
            synchronized (Test.o1) {
                
                Thread.sleep(500);
            }
            
            synchronized (Test.o2) {
                System.out.println("aaaa");
            }
        } catch (InterruptedException ex) {
            
        }
           }
        else
           try {
            synchronized (Test.o2) {
                Thread.sleep(500);
            }
            
            synchronized (Test.o1) {
                System.out.println("aaba");
            }
        } catch (InterruptedException ex) {
           
        }
        
    }
}
运行后显示
compile:
run:
0
2
aaba
aaaa
BUILD SUCCESSFUL (total time: 0 seconds)
没有发生死锁,这是为什么????/我哪里搞错了啊?

解决方案 »

  1.   

    没有死锁的条件啊
    synchronized (Test.o2) {
                    Thread.sleep(500);
                } //这里就释放了Test.o2的对象锁了吧
      

  2.   

    要死锁,可以修改成两个线程均不释放o1或o2的锁,如下:public void run() {
    System.out.println(a);
    if(a == 0){
    try {
    synchronized (TestSync.o1) { //已获取o1对象锁
    Thread.sleep(500);
    System.out.println("Try to get o2");
    synchronized (TestSync.o2) {  //未释放o1,尝试获取o2,被挂起
    System.out.println("aaaa");
    }
    }
    } catch (InterruptedException ex) {

    }
    } else {
    try {
    synchronized (TestSync.o2) { //已获取o2的对象锁
    Thread.sleep(500);
    System.out.println("Try to get o1");
    synchronized (TestSync.o1) {  //未释放o2,尝试获取o1,也被挂起,死锁
    System.out.println("aaba");
    }
    }
    } catch (InterruptedException ex) {
               
            }
    }
    }
      

  3.   

    不好意思,在本地验证时,把类Test修改成TestSync类了,上面访问o1,o2的属性时,也被我改了。CSDN的回复不允许编辑,错了也没办法纠正,呵呵