假设我有一个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。