これらを組み合わせて、一度に1つのスレッドのみが書き込みアクセスできるようにアレンジできますが、スレッドが書き込み中の場合を除き、好きなだけ多くのリーダーが同時に読み取ることができます。
別の言い方をします。構造からreadを実行するたびに、readロックを取得します。 writeを実行するたびに、writeロックを取得します。この方法では、書き込みが行われるたびに誰も読んでいないことになります(排他アクセス権があると想像できます)が、誰も書いていない限り、同時に多くの読者が読むことができます。
ReadWriteLock
のドキュメントはこれを明確にします:
ReadWriteLockは、読み取り専用操作用と書き込み用に関連付けられたロックのペアを維持します。読み取りロックは、ライターがない限り、複数のリーダースレッドによって同時に保持されます。書き込みロックは排他的です。
そのため、一度に多くのリーダーを持つことができますが、ライターは1人だけです。ライターは、リーダーも読むことを妨げます。これは、複数のスレッドから安全に読み取ることができるリソースがあり、読み取りが書き込みよりもはるかに一般的であるが、実際にはリソースがでない場合に便利です読み取り専用。 (ライターがなく、読み取りが安全であれば、ロックはまったく必要ありません。)
スレッドがWriteLock
を取得すると、そのスレッドがロックを解除しない限り、他のスレッドはReadLock
の同じインスタンスのWriteLock
もReentrantReadWriteLock
も取得できません。 。ただし、複数のスレッドが同時にReadLock
を取得できます。
ReadWriteLockを使用すると、共有オブジェクトで書き込みよりも多くの読み取りが実行されるアプリケーションのパフォーマンスを改善できます。
ReadWriteLockは、読み取りおよび書き込み操作用に2つのロックを維持します。同時に取得または読み取りできるロックは1つのみです。ただし、書き込みロックがどのスレッドによっても取得されていない場合、複数のスレッドが同時に読み取りロックを取得できます。
ReentrantReadWriteLockは、ReadWriteLockの実装です。複数のスレッドが読み取りロックを待機していない場合、最も長い待機スレッドに書き込みロックを与えます。複数のスレッドが読み取りロックを待機している場合、それらのスレッドに読み取りロックが付与されます。
読み取りロックを取得したリーダーは読み取りロックを再取得できます。同様に、ライターは書き込みロックを再取得でき、読み取りロックも取得できます。
http://www.zoftino.com/Java-concurrency-lock-and-condition-examples を参照してください