プログラム悪戦苦闘日記

はてなダイアリーからの移行(遺物)

Tiger Concurrency Utilities -part3-

ひさびさの更新になってしまった。今回はReadWriteLockの話。

ReadWriteLock インターフェイス

1.概要
「読み」は多数OKでも「書き」はひとりだけ、というときに使うロック。キャッシュなんかによく使われるらしい。操作は、

 
2.均等性ポリシー
 「均等性ポリシー」とは、簡単にいってしまうと、ロック取得のため待機しているスレッドに、均等にロック取得の機会を与えるか否かのことである。ReentrantLockクラスやReentrantReadWriteLockクラスの場合、コンストラクタの第一引数で指定できる。
 
 ReaentrantLockの場合、このポリシーをtrue(fair)にすると、最も長く待たされているスレッドがロックを取得する。ReentrantReadWriteLockの場合、最も長く待っているWriterスレッドか、すべてのWriterスレッドより長く待っているReaderスレッドがロックを取得する。通常の場合、false(unfair)でよさそうに思えるが、true(fair)にしておかないと、いつまで経ってもロックが取得できないスレッドが出てきてしまう。おそらくほとんどの場合、true(fair)にする必要があると思える。特にReadWriteLockの場合、通常Readerスレッドの数がWriterスレッドより多いので、Writerロックがいつまでもロックできなくなってしまう。