Notifyall()不是最后一条语句



假设我有一个Java的读写监视器实现。

多个reader或一个Writer可以同时访问数据库(不能同时访问)

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--;)

是否为最后一条语句无关紧要。

为notifyAll()引用javadoc:

被唤醒的线程将无法继续,直到当前线程放弃对该对象的锁。

不,没关系。锁将一直保持到synchronized块结束,并且在此期间没有线程能够对锁进行wait操作。实际上,先使用notify稍微有利一些,因为异常可能会停止更新,但不会停止notify。

相关内容

  • 没有找到相关文章

最新更新