public interface ReadWriteLock
locks
のペアを制御します。read lock
は、ライターが存在しないかぎり、複数のリーダースレッドが同時に保持できます。write lock
は排他的です。
すべての ReadWriteLock 実装で、関連付けられた readLock に関して writeLock 操作のメモリー同期効果 (Lock
インタフェースで指定されている) も保持されていることを保証する必要があります。つまり、正常に読み込みロックを取得したスレッドでは、書き込みロックが前回解放されたときに行われたすべての更新内容を認識します。
読み込み - 書き込みロックを使用すると、相互排他ロックを使用する場合よりも広範な並行性を共有データへのアクセスに持たせることができます。これは、共有データを変更できるのは 1 回につき 1 つのスレッド (ライタースレッド) だけであるにもかかわらず、多くの場合は任意の数のスレッド (リーダースレッド) がデータを並行して読み取ることができるという事実を利用します。理論上は、読み込み - 書き込みロックの使用で許可される並行性を向上させると、相互排他ロックを使用する場合と比べてパフォーマンスが向上します。実際には、並行性向上が十分に実現されるのは、複数のプロセッサ上で使用され、共有データのアクセスパターンが適している場合だけです。
読み込み - 書き込みロックにより相互排他ロックよりもパフォーマンスが向上するかどうかは、データ変更に対するデータ読み込みの頻度、読み込みおよび書き込みの持続期間、およびデータの競合、つまり同時にデータを読み取るまたは書き込むスレッドの数に依存します。たとえば、データが入れられたあと、あまり変更されることなく (ディレクトリなどが) 頻繁に検索されるコレクションは、読み込み - 書き込みロックの理想的な候補になります。ただし、更新が頻繁に行われる場合、データの時間の大半は排他的ロックに費やされるため、並行性は向上するとしてもごくわずかです。さらに、読み込み操作の時間が短すぎると、読み込み - 書き込みロックの実装によるオーバーヘッド (本来、相互排他ロックよりも複雑) により実行コストが支配されてしまう可能性があります。多数の読み込み - 書き込みロック実装が少ないコードセクションですべてのスレッドを直列化する場合は、特にこのことが当てはまります。結局のところ、読み込み - 書き込みロックが使用するアプリケーションに適しているかどうかを調べるには、プロファイリングと計測を実行するしかありません。読み込み - 書き込みロックの基本操作は複雑ではありませんが、実装で行う必要のあるポリシー上の決定が多数存在します。
これらの決定は、指定されたアプリケーションでの読み込み - 書き込みロックの効果性に影響を与える場合があります。これらのポリシーの例を、次に示します。
ReentrantReadWriteLock
, Lock
, ReentrantLock
バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.