web-dev-qa-db-ja.com

ReentrantReadWriteLock:ReadLockとWriteLockの違いは何ですか?

私が知っているのは:

  • ReadLockWriteLock は互いに何らかの影響を及ぼします
  • WriteLocksynchronizedと同じです
  • ReadLockは単独では機能しないようです
34
不是phd的phd

readLock.lock();

  • これは、他のスレッドがwriting(つまり、書き込みロックを保持している)である場合、他のスレッドが書き込みを行わなくなるまでここで停止することを意味します。
  • ロックが許可されると、ロックが解除されるまで、他のスレッドはwrite(つまり、書き込みロックを取得)できなくなります。

writeLock.lock();

  • これは、他のスレッドがreadingorwritingである場合、ここで停止し、他のスレッドが読み取りまたは書き込みを行わなくなるまで待機することを意味します。
  • ロックが許可されると、他のスレッドはreadorwrite(つまり、読み取りまたは書き込みロックを取得する)を許可されません。ロックが解除されるまで。

これらを組み合わせて、一度に1つのスレッドのみが書き込みアクセスできるようにアレンジできますが、スレッドが書き込み中の場合を除き、好きなだけ多くのリーダーが同時に読み取ることができます。

別の言い方をします。構造からreadを実行するたびに、readロックを取得します。 writeを実行するたびに、writeロックを取得します。この方法では、書き込みが行われるたびに誰も読んでいないことになります(排他アクセス権があると想像できます)が、誰も書いていない限り、同時に多くの読者が読むことができます。

96
OldCurmudgeon

ReadWriteLock のドキュメントはこれを明確にします:

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

そのため、一度に多くのリーダーを持つことができますが、ライターは1人だけです。ライターは、リーダーも読むことを妨げます。これは、複数のスレッドから安全に読み取ることができるリソースがあり、読み取りが書き込みよりもはるかに一般的であるが、実際にはリソースがでない場合に便利です読み取り専用。 (ライターがなく、読み取りが安全であれば、ロックはまったく必要ありません。)

17
Jon Skeet

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

6
Eng.Fouad

ReadWriteLockを使用すると、共有オブジェクトで書き込みよりも多くの読み取りが実行されるアプリケーションのパフォーマンスを改善できます。

ReadWriteLockは、読み取りおよび書き込み操作用に2つのロックを維持します。同時に取得または読み取りできるロックは1つのみです。ただし、書き込みロックがどのスレッドによっても取得されていない場合、複数のスレッドが同時に読み取りロックを取得できます。

ReentrantReadWriteLockは、ReadWriteLockの実装です。複数のスレッドが読み取りロックを待機していない場合、最も長い待機スレッドに書き込みロックを与えます。複数のスレッドが読み取りロックを待機している場合、それらのスレッドに読み取りロックが付与されます。

読み取りロックを取得したリーダーは読み取りロックを再取得できます。同様に、ライターは書き込みロックを再取得でき、読み取りロックも取得できます。

http://www.zoftino.com/Java-concurrency-lock-and-condition-examples を参照してください

0
Arnav Rao