What happens when you try to compile and run the following application? Choose all correct options. 
  1. public class Z { 
  2. public static void main(String[] args) { 
  3. new Z(); 
  4. } 
  5. 
  6. Z() { 
  7. Z alias1 = this; 
  8. Z alias2 = this; 
  9. synchronized(alias1) { 
  10. try { 
  11. alias2.wait(); 
  12. System.out.println(“DONE WAITING”); 
  13. } 
  14. catch (InterruptedException e) { 
  15. System.out.println(“INTERR 
  UPTED”); 
  16. } 
  17. catch (Exception e) { 
  18. System.out.println(“OTHER EXCEPTION”); 
  19. } 
  20. finally { 
  21. System.out.println 
  (“FINALLY”); 
  22. } 
  23. } 
  24. System.out.println(“ALL DONE”); 
  25. } 
  26. } 
  A. The application compiles but doesn't print anything. 
  B. The application compiles and print “DONE WAITING” 
  C. The application compiles and print “FINALLY” 
  D. The application compiles and print “ALL DONE” 
  E. The application compiles and print “INTERRUPTED” 

解决方案 »

  1.   

    A
    synchronized(alias1)代码块里面一直在wait()处阻塞
    alias1和alias2是同一个对象
    这个代码相当于
    synchronized(alias1){
    alias1.wait();//这句话先释放alias1的锁,然后阻塞
    }
      

  2.   

    那么是不是在alias2.wait(); 之后加一个notify();或者notifyAll();就可以输出了呢?
      

  3.   

    alias对象监视器上的线程已经wait()了,所以一直阻塞,你在wait之后加notifty是执行不到的,只能另开一个线程,调用alias.notifyAll();