ReadWriteLock について、何かを読み取ろうとしているときにロックが必要になるのはなぜですか? 私の知る限り、ロックは変数を変更している場合にのみ使用され、同時スレッドが変数を変更しようとするのを避けるために変数を読み取ることはありません。では、なぜ読み取り専用に Lock が必要なのでしょうか?
2 に答える
いくつかの種類のオブジェクトは、相互に何らかの関係を持つことが期待される可変状態の複数の側面をカプセル化します。たとえば、 にはプロパティと番号付きスロットの束があるList
場合があります。Count
100 個のアイテムを含むリストが開始され、スレッドがそれらを列挙しようとするとします。列挙スレッドが項目 50 に到達する頃に、別のスレッドが番号 25 の前に項目を挿入しようとします。
列挙スレッドが開始前に読み取りロック トークンを取得し、完了時にそれを解放し、アイテムを挿入するスレッドが最初に書き込みロック トークンを取得した場合、列挙スレッドが読み取りロック トークンを取得したという事実列挙が完了するまで、更新スレッドがリストを変更するのを防ぎます。任意の数の列挙スレッドを競合なしで同時に動作させることができますが、リストに変更を加える前に、すべてのスレッドを完了する (読み取りロック トークンを解放する) 必要があることに注意してください。書き込みロック トークン要求が行われると、読み取りロック トークンの要求は、書き込みロック トークンが発行されて解放されるまで延期されることに注意してください。これが行われなかった場合、読み取り要求の安定したストリームにより、書き込み要求が発行されなくなる可能性があります。