假设我在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--;
)
答案 0 :(得分:4)
答案 1 :(得分:3)
不,没关系。锁定仍将保持到synchronized
块结束,并且在中间时间内没有线程能够wait
锁定。事实上,首先使用通知是有利的,因为异常可能会停止更新,但不会停止通知。