ConcurrentHashMap がマップとして使用されている場合、スレッドセーフを実現する正しい方法は何ですか?
ある本で、次のようなものを見つけました。
private ConcurrentHashMap<KEY, VALUE> cache = new ConcurrentHashMap<>();
public V put(KEY key, VALUE value) {
VALUE ret = cache.get(key);
if (ret == null) {
ret = cache.putIfAbsent(key, value);
if (ret == null) {
ret = value;
}
}
return ret;
}
ここで、get と put を次のようにアトミックにする必要はないかと自問します。
public V put(KEY key, VALUE value) {
synchronized(cache) {
VALUE ret = cache.get(key);
if (ret == null) {
ret = cache.putIfAbsent(key, value);
if (ret == null) {
ret = value;
}
}
}
return ret;
}
cache.get() が null を返すと、別のスレッドが最初のスレッドの cache.get() の結果を無効にする可能性があるためですか?
乾杯 オリバー