投機的実行をやってみたやつで、synchronizedを使ってたのだけど、ReadWriteLockを使ったほうが並列可能性が高くなるかもね、と思ってちょっと修正してみた。
ところで、最後のロックを次のように、ReadLockの中でWriteLock取得しようと思ったんだけど、デッドロックしてしまったようだ。
こういう再入はできないらしい。
Lock rlock = lock.readLock(); try{ rlock.lock(); if(modified.get()){ if(version != readVer.get()){ //変更されている continue; } Lock wlock = lock.writeLock(); try{ wlock.lock(); value = myValue.get(); version++; }finally{ wlock.unlock(); } } }finally{ rlock.unlock(); }
ということで、こんな感じ