答えて

71
readLock.lock(); 

これは、他のスレッドが書き込み(すなわち、書き込みロックを保持している)であるならば、他のスレッドが書き込みされなくなるまで、ここで停止することを意味します。

ロックが許可されると、ロックが解除されるまで、他のスレッドはに書き込むことはできません。つまり、を書き込みます(書き込みロックを取る)。


writeLock.lock(); 

これは、もしあれば、他のスレッドがを書いを読んでいることを意味し、ここで停止し、他のスレッドが読んでいないか、書き込みされるまで待ちます。ロックが解除されるまで

ロックが付与されると、他のスレッドがを許されないであろう(すなわち、リードを取るか、またはロックを書き込む)又は書き込みを読み取ります。あなたは、スレッドが書き込みされている場合を除き、同時に読み取ることができます好きなようにあなたが書き込みアクセスが、できるだけ多くの読者を持つように、同時に複数のスレッドを手配することができ、これらを組み合わせること


別の言い方をしてください。いつでもあなたは構造体からを読むことを望むたびに、を読んでと読む。 を書くときはいつも、と書いてください。を書くと、と書いてあります。このようにして、書き込みが発生したときは誰も読んでいません(あなたは排他的なアクセス権があると思います)が、誰も書いていない限り、同時に読める読者が多いことがあります。

+1

+1良い説明。明確にするために、 'one'は' thread'を意味します。 –

15

ReadWriteLockのドキュメントは、これは明らかに:

A ReadWriteLockは、読み取り専用操作用と書き込み用1、関連するロックのペアを保持します。ライターが存在しない限り、読み取りロックは複数のリーダースレッドによって同時に保持されることがあります。書き込みロックは排他的です。

一度に多数の読者を持つことができますが、1人の作家だけが読者の読書を妨げることになります。これは、複数のスレッドから読み込むのに安全なリソースがある場合や、読み込みが書き込みよりも一般的な場合、リソースがでない場合には、実際には読み取り専用です。 (安全で何の作家や読み取りがない場合は、すべてでロックの必要はありません。)

+1

100人の読者がいて、その間に1人のライターがロックを取得したいとしたら、読者は中断されますか?またはライターは現在の読者がロックを解除するまで待たなければなりません。 – Vipin

+1

@Vipin:作家は待たなければなりません。 –

+0

あなたの答えは完璧です:) – Vipin

6

スレッドがWriteLockを取得すると、他のスレッドがReadLockReentrantReadWriteLockの同じインスタンスのWriteLock、しない限りを取得することはできませんそのスレッドはロックを解除します。ただし、複数のスレッドで同時にReadLockを取得できます。

関連する問題