HashMap线程安全吗?

时间:2013-07-26 15:16:31

标签: java collections guava

com.google.common.collect.HashBiMap的文档没有说明它是否是线程安全的。我想这意味着它不是,但我想如果我错了就会问。

5 个答案:

答案 0 :(得分:17)

HashBiMap在内部使用多个自定义哈希表,这些哈希表不是线程安全的。您应该使用:{/ p>同步HashBiMap的访问权限

Maps.synchronizedBiMap(yourHashBiMap);

答案 1 :(得分:2)

查看source code,它似乎与我同步。

private V More ...putInBothMaps(@Nullable K key, @Nullable V value, boolean force) {
   boolean containedKey = containsKey(key);
   if (containedKey && Objects.equal(value, get(key))) {
     return value;
   }
   if (force) {
     inverse().remove(value);
   } else {
     checkArgument(!containsValue(value), "value already present: %s", value);
   }
   V oldValue = delegate.put(key, value);
   updateInverseMap(key, containedKey, oldValue, value);
   return oldValue;
 }

此处delegateinverseMap是内部使用的两个Map

答案 2 :(得分:0)

As docs says

  

由两个哈希表支持的BiMap。

并且

  

HashMap未同步。必须在外部同步。

答案 3 :(得分:0)

该实现基于两个哈希表。 HashMap的实现基于一个哈希表,并且HashMap不同步。我认为假设HashBiMap需要外部同步是一个很好的经验法则。

答案 4 :(得分:0)

HashBiMap内部依赖于HashMaps,它不是线程安全的。