com.google.common.collect.HashBiMap的文档没有说明它是否是线程安全的。我想这意味着它不是,但我想如果我错了就会问。
答案 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;
}
此处delegate
和inverseMap
是内部使用的两个Map
。
答案 2 :(得分:0)
答案 3 :(得分:0)
该实现基于两个哈希表。 HashMap的实现基于一个哈希表,并且HashMap不同步。我认为假设HashBiMap需要外部同步是一个很好的经验法则。
答案 4 :(得分:0)
HashBiMap内部依赖于HashMaps,它不是线程安全的。