丁保国的博客

收集整理工作生活,点点滴滴

  :: :: 博问 :: 闪存 :: :: :: :: 管理 ::
notify()及notifyAll()是Object的方法,与Object的wait()方法配合使用,而且这三个方法必须在同步块中调用.  
   
  如下:  
  在线程1中执行如下代码  
  ...  
  synchronized(obj1)             //1.进入同步块  
  {  
          try   {  
          ...  
          obj1.wait();                 //2.进入暂停状态  
          }catch   (InterruptedException   exp)   {}  
  }  
   
  1.当前同步对象(monitor)为obj1,obj1是任一实例,若是同步方法,则同步对象是this.进入同步块后,obj1为锁定状态,锁定状态 对obj1本身无任何影响,而其它线程执行到同一代码时,因不能获得锁,处于Block状态,一旦解锁,被block的线程自动继续执行.  
  2.调用obj1.wait()有两个作用,一是使线程进入等待状态,二是解锁obj1,这时被block的线程将获得锁.线程1要退出等待必须要由其它线程显式的调用obj1.notify()或notifyAll()方法.  
   
  如  
   
  ...  
  synchronized(obj1)  
  {  
          ...  
          obj1.notify();         //3.   向wait的线程发通知信息  
          ...  
  }  
  ...  
   
  若其它线程执行到此时,线程1处于wait状态,则wait状态解除,解除后,若线程1若得到锁就能继续执行,若有多个线程处于obj1的wait状态,notify将随机选一个线程激活,而notifyAll是同时解除所有的wait状态.  

   

 

 

 

 

如果在同步块入口点阻塞,不须其它线程调用notify(),调了也没效果,同步块能自动获得锁  
   
  如果是wait造成了阻塞,须用notfiy()激活,这两个方法是配合使用   

posted on 2008-10-15 08:43  丁保国  阅读(287)  评论(0编辑  收藏  举报