私が知っているのは、writelockはちょうど同期のようなものです。ReentrantReadWriteLock、ReadLockとWriteLockの違いは何ですか?
読み取りロックと書き込みロックは、何らかの形で互いに影響します。
ReadLockは単独では動作しないようです。
私が知っているのは、writelockはちょうど同期のようなものです。ReentrantReadWriteLock、ReadLockとWriteLockの違いは何ですか?
読み取りロックと書き込みロックは、何らかの形で互いに影響します。
ReadLockは単独では動作しないようです。
readLock.lock();
これは、他のスレッドが書き込み(すなわち、書き込みロックを保持している)であるならば、他のスレッドが書き込みされなくなるまで、ここで停止することを意味します。
ロックが許可されると、ロックが解除されるまで、他のスレッドはに書き込むことはできません。つまり、を書き込みます(書き込みロックを取る)。
writeLock.lock();
これは、もしあれば、他のスレッドがを書いかを読んでいることを意味し、ここで停止し、他のスレッドが読んでいないか、書き込みされるまで待ちます。ロックが解除されるまで
ロックが付与されると、他のスレッドがを許されないであろう(すなわち、リードを取るか、またはロックを書き込む)又は書き込みを読み取ります。あなたは、スレッドが書き込みされている場合を除き、同時に読み取ることができます好きなようにあなたが書き込みアクセスが、できるだけ多くの読者を持つように、同時に複数のスレッドを手配することができ、これらを組み合わせること
。
別の言い方をしてください。いつでもあなたは構造体からを読むことを望むたびに、を読んでと読む。 を書くときはいつも、と書いてください。を書くと、と書いてあります。このようにして、書き込みが発生したときは誰も読んでいません(あなたは排他的なアクセス権があると思います)が、誰も書いていない限り、同時に読める読者が多いことがあります。
ReadWriteLock
のドキュメントは、これは明らかに:
A ReadWriteLockは、読み取り専用操作用と書き込み用1、関連するロックのペアを保持します。ライターが存在しない限り、読み取りロックは複数のリーダースレッドによって同時に保持されることがあります。書き込みロックは排他的です。
一度に多数の読者を持つことができますが、1人の作家だけが読者の読書を妨げることになります。これは、複数のスレッドから読み込むのに安全なリソースがある場合や、読み込みが書き込みよりも一般的な場合、リソースがでない場合には、実際には読み取り専用です。 (安全で何の作家や読み取りがない場合は、すべてでロックの必要はありません。)
スレッドがWriteLock
を取得すると、他のスレッドがReadLock
もReentrantReadWriteLock
の同じインスタンスのWriteLock
、しない限りを取得することはできませんそのスレッドはロックを解除します。ただし、複数のスレッドで同時にReadLock
を取得できます。
+1良い説明。明確にするために、 'one'は' thread'を意味します。 –