0

假设我在 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--;

4

2 回答 2

4

它是否是最后一个语句并不重要。

引用notifyAll() 的 javadoc

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

于 2013-05-02T16:00:08.883 回答
3

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

于 2013-05-02T16:00:56.767 回答