Java で読み取り/書き込みモニターを実装しているとします。
複数のリーダーまたは 1 つのライターが同時にデータベースにアクセスできます (両方ではない)。
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--;
)