我有以下代码:
public class Cache {
private final Map map = new ConcurrentHashMap();
public Object get(Object key) {
Object value = map.get(key);
if (value == null) {
value = new SomeObject();
map.put(key, value);
}
return value;
}
}
我的问题是:
映射的
put
和get
方法是线程安全的,但是由于整个块未同步-多个线程可以两次添加同一 key 吗? 最佳答案
从不同的线程调用它们不会破坏数据结构的意义上,put
和get
是线程安全的(例如,使用普通的java.util.HashMap
可能是)。
但是,由于该块未同步,因此您可能仍然有多个线程添加相同的键:
两个线程都可以通过null
检查,一个线程添加 key 并返回其值,然后第二个线程将使用新的 key 覆盖该值并返回它。