6

契約について詳しく教えてください。に含まれる 2 つのロックがReentrantReadWriteLock何らかの形で関連しているかどうかわかりません。それとも、これらは 2 つの通常のロックの単なるバンドルですか?

4

2 に答える 2

9

複数のスレッドがリソースを同時に読み取ることができますが、スレッドがリソースに書き込むために排他ロックを待機する必要があります。

ルールは次のとおりです。

  • 複数のリーダーがリソースを同時に共有できます。読み取りロックがある場合は、別の読み取りロックを安全に取得できます。共有ロックの最大数は 1111 1111 1111 1111 です
  • 読み取りロックを持っている場合、書き込みロックを取得することはできません
  • 書き込みロックがある場合、他のスレッドで読み取りロックを取得することはできません。
  • 他のスレッドでアクティブなライターが存在しない場合、リーダーはリソースにアクセスできます。
  • 書き込みロックがある場合は、同じスレッドで別の書き込みロックを取得できます。スレッドが所有できる排他ロックの最大数は 1111 1111 1111 1111 です。
  • (別のスレッドからの) 他のリーダーまたはライターがアクティブでない場合、ライターはリソースにアクセスできます。
  • 読者よりも作家を好む。つまり、ライターがロックを待機している場合、他のスレッドからの新しいリーダーはリソースにアクセスできません。既存のリーダーは、ロックを解除するまで引き続きリソースを使用できます。これにより、いわゆる「ライターの飢餓」が防止されます。
  • 書き込みロックを取得し、次に読み取りロックを取得し、次に書き込みロックを解放することにより、書き込みロックから読み取りロックへのダウングレードを許可します。ただし、読み取りロックから書き込みロックへのアップグレードはできません。

内部的には、ロック状態 (c) は int 値によって維持されます。この場合、読み取りロックと書き込みロックがあるため、論理的に 2 つの短縮形に分割されます。下位は排他 (ライター) ロック保持カウントを表し、上位は共有 (リーダー) 保持カウントを表します。

ロックの現在の状態が c= xxxx xxxx xxxx xxxx yyyy yyyy yyyy yyyy であると仮定すると、リーダー ロックの数は上位ビット xxxx xxxx xxxx xxxx です。

ライタロック数は下位ビット yyyy yyyy yyyy yyyy

于 2013-02-19T11:35:18.603 に答える
2

スレッドが読み取りロックを待っている場合は共有されますが、スレッドが書き込みロックを取得したい場合は、そのスレッドのみが相互排除と同じアクセスを許可されます。

どちらか一方の操作が許可されます。if lock is held by readers and thread request write lock no more readers are allowed to acquire read lock until thread which has acquired write lock release it.

于 2012-10-26T17:59:02.550 に答える