10

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

4

5 回答 5

20

HashBiMap 在内部使用多个自定义哈希表,它们不是线程安全的。您应该与以下内容同步访问HashBiMap

Maps.synchronizedBiMap(yourHashBiMap);
于 2013-07-26T15:19:12.267 回答
2

看看源代码,对我来说似乎不同步。

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是它在内部使用的两个Maps。

于 2013-07-26T15:23:57.200 回答
0

正如文档所说

由两个哈希表支持的 BiMap。

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

于 2013-07-26T15:19:02.350 回答
0

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

于 2013-07-26T15:19:34.337 回答
0

HashBiMap 内部依赖于非线程安全的 HashMap。

于 2013-07-26T15:19:36.807 回答