class  z {
 public static void main(String[] args){
new z();
}
z(){
z alias = this;
z alias2 = this;
synchronized(alias){
 try{
 alias2.wait();
 System.out.println("done waiting");
}
catch(InterruptedException e){
System.out.println("interrupted");
}
catch(Exception e){
 System.out.println("other exception");
}
finally{
 System.out.println("finally");
}
}
System.out.println("all done");
}
}
这下面的句子不是很好理解
z alias = this;
z alias2 = this;//这里的alias与alias2都是指向当前的对象吗?alias==alias2?
synchronized(alias){
 try{
 alias2.wait(); //alias2又不是线程怎么可以用wait(); 
//我知道wait();是在object 类里的,我是说alias2不是线程呀!!!
 System.out.println("done waiting");
}
谁可以帮我分析一下吗?
   谢谢啦!!!!!

解决方案 »

  1.   

    1、alias==alias2
    2、所有的类都直接或间接的继承object类
      

  2.   

    这下面的句子不是很好理解
    z alias = this;
    z alias2 = this;//这里的alias与alias2都是指向当前的对象吗?alias==alias2?
    ------------------------------------------------------------------------------
    对,alias==alias2 ,alias和alias2指向同一个对象.
    synchronized(alias){
     try{
     alias2.wait(); //alias2又不是线程怎么可以用wait(); 
    //我知道wait();是在object 类里的,我是说alias2不是线程呀!!!
     System.out.println("done waiting");
    }
    -----------------------------------------------------------------------------------
    alias2确实不是线程,要表达的确切意思是当前线程wait在alias这个资源这里.
    至于为什么能够在alias对象的同步块中调用alias2.wait();, 就是因为上面提到的alias和alias2指向同一个对象,所以使用同一把锁.
      

  3.   

    要表达的确切意思是当前线程wait在alias这个资源这里.
    sorry, 是"wait在alias2这个资源这里." , 笔误
      

  4.   

    z alias = this;
    z alias2 = this;
    synchronized(alias){
    try{
    alias2.wait();
    System.out.println("done waiting");
    }我觉得这个程序一执行就会死掉,