我最近遇到了以下构造
Map<String,Value> map = new HashMap<>();
...
Value getValue(String key) {
synchronized (key.intern()) {
return map.remove(key);
}
}
鉴于这intern()
通常不是那么快,我怀疑这会优于使用synchronized
,Collections.synchronizedMap(Map)
或ConcurrentHashMap
. 但是,即使在这种特殊情况下,这种构造会比所有其他方法更快:这是否正确同步?我怀疑这是线程安全的,因为在重新组织哈希表时可能会发生删除。但即使这可行,我怀疑鉴于HashMap javadoc状态代码会被破坏:
如果多个线程同时访问一个哈希映射,并且至少有一个线程在结构上修改了映射,则必须在外部进行同步。