如果将 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() 结果无效?
干杯奥利弗