次のようなコードがあるとします。
public final class SomeClass
{
private final Map<SomeKey, SomeValue> map = new HashMap<SomeKey, SomeValue>();
// ...
public SomeValue getFromCache(final SomeKey key)
{
SomeKey ret;
synchronized(map) {
ret = map.get(key);
if (ret == null) {
ret = buildValue(key);
map.put(key, ret);
}
}
return ret;
}
//etc
}
問題はパフォーマンスです。buildValue()
が高価な関数である場合、その値を構築する必要がある 1 つの呼び出し元が、値が既に存在する可能性のある他のすべての呼び出し元をブロックします。値を構築する必要がある呼び出し元が他の呼び出し元をブロックしないメカニズムを見つけたいと思います。
この問題がまだ取り組まれていない (そして解決されていない) とは信じられません。解決策をグーグルで検索しようとしましたが、これまでのところ見つかりませんでした。それを行うためのリンクはありますか?
を使おうと思っていたのReentrantReadWriteLock
ですが、まだ何も付いていません。