【发布时间】:2016-12-02 16:12:06
【问题描述】:
大部分访问是读取,地图本身相对较小。也就是说,以下内容是否安全,我的测试表明结果比 ConcurrentHashMap 更快(至少在 1.7 倍上)。
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;
}
【问题讨论】:
-
您尝试过
Collections.synchronizedMap()实现吗?它使用大致相同的系统,并且比ConcurrentHashMap更快(相对较小) -
@n247s 我认为它们完全不同。同步的地图将强制锁定每次获取。这仅在辅助获取上强制锁定。代价是我在引入新密钥时需要重新复制所有内容。
-
你真的需要写时复制吗?
-
@JimmyB 由于地图不是线程安全的,是的,您按照 John Vint 的确认进行操作。如果我们直接修改地图,Volatile 不会给我们任何帮助。
标签: java performance concurrency