0

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

4

2 に答える 2

4

それが最後のステートメントであるかどうかは関係ありません。

notifyAll()の javadoc を引用するには:

目覚めたスレッドは、現在のスレッドがこのオブジェクトのロックを放棄するまで先に進むことができません。

于 2013-05-02T16:00:08.883 に答える
3

いいえ、関係ありません。ロックはブロックの最後まで保持され、その間にsynchronizedスレッドはロックできなくなります。wait実際、例外によって更新は停止されるが、通知は停止されない可能性があるという点で、最初に通知を行う方がわずかに有利です。

于 2013-05-02T16:00:56.767 に答える