notifyall()不是最后一个语句

时间:2013-05-02 15:57:55

标签: java concurrency monitors

假设我在Java中有一个读/写监视器实现。

几个读者或一个作家可以同时访问数据库(不是两者)

class RWmonitor{
   private int readers = 0;
   private boolean writing = false;

   public synchronized void StartRead(){ ..}
   public synchronized void EndRead(){ 
      notifyAll();
      readers--;
   }

   public synchronized void StartWrite(){ ..}
   public synchronized void EndWrite(){
      notifyAll();
      writing = false;
   }
}

现在,notifyAll()不是同步方法中的最后一个语句是否重要?

假设:

1)EndRead()执行

2)notifyAll()通知所有等待的线程

3)然后它减少了读者数量。

当它执行notifyAll()时,由于唤醒的线程将等待RWmonitor的锁定被释放,它是否会更加昂贵? (假设在RWmonitor上具有锁定的线程仍在readers--;

2 个答案:

答案 0 :(得分:4)

如果它是最后一个声明并不重要。

引用javadoc for notifyAll()

  

在当前线程放弃对该对象的锁定之前,唤醒的线程将无法继续。

答案 1 :(得分:3)

不,没关系。锁定仍将保持到synchronized块结束,并且在中间时间内没有线程能够wait锁定。事实上,首先使用通知是有利的,因为异常可能会停止更新,但不会停止通知。