7

以下は、典型的なリーダーとライターのパターンです (読み取りが多く、書き込みが少ない)。

  private ReadWriteLock lock = new ReentrantReadWriteLock();
  private int value;

  public void writeValue(int newValue){
       lock.writeLock().lock();
       try{
           this.value = newValue;
       }
       finally{
           lock.writeLock().unlock();
       }
  }

  public int readValue(){
       lock.readLock().lock();
       try{
           return value;
       }
       finally{
           lock.writeLock().unlock();
       }
  }

ライターとリーダーを優先することは可能ですか?たとえば、通常、ライターは、他のスレッドによって保持されている読み取りロックが常に保持されている場合、非常に長い時間 (おそらく永遠に) 待機する可能性があるため、より高い優先度のライターを使用することは可能ですか?優先度の高い(スキップライン)そのようなもの。

4

2 に答える 2

5

javadocによると、jdk 実装にはリーダー/ライターの優先順位はありません。ただし、「公平な」実装を使用する場合、ロックfifo の順序で付与されます (まだリーダー/ライターの設定はありません)。そのため、少なくとも将来のリーダーは待機中のライターをブロックしません。

于 2012-08-12T19:14:26.297 に答える
0

書き込みロックは、実際には既に読み取りロックよりも優先されています。

スレッドがリソースを読み取りたい場合、スレッドがそれに書き込みを行っておらず、スレッドがリソースへの書き込みアクセスを要求していない限り問題ありません。書き込みアクセス要求の優先度を上げることで、書き込み要求が読み取り要求よりも重要であると想定します。

詳細については、この優れた投稿を参照してください。

編集: これは公正モードのみに当てはまることに注意することが重要です。ありがとう@jtahlborn!

于 2012-08-12T19:06:33.100 に答える