大多数访问都是读取,而地图本身会相对较小。那说以下是安全的,我的测试显示结果比ConcurrentHashMap快(至少在1.7x上)。
volatile Map<String, Object> mapV;
public Object getV(String key) {
Object value = mapV.get(key);
if (value == null) {
synchronized(this) {
value = mapV.get(key);
if (value == null) {
value = new Object();
Map<String, Object> copy = new HashMap<String, Object>();
copy.putAll(mapV);
copy.put(key, value);
mapV = Collections.unmodifiableMap(copy);
}
}
}
return value;
}
答案 0 :(得分:2)
这将是线程安全的。由于您的地图分配是易失性的,任何看到mapV.get(key) != null
的线程都会遇到易失性读取,因此是安全的。
作为编辑:如果这实际上更快或者对于大量数据它会更快,我会感到惊讶。我肯定会使用ConcurrentHashMap
代替此实现。