Maps.synchronizedBiMap()
方法声明了
用户必须在返回的地图上手动同步 访问其任何集合视图时。
这是否包含BiMap的inverse()
视图?例如,如果变量初始化如下例所示,则可以从其他线程调用inverse.put()
是有问题的(例如,get()
或map
调用中的变化不可见{1}},即使inverse
发生在 put
之前?)
get
如果这实际上是一个问题,是否有一种标准/推荐的解决方法?
//编辑
查看实施情况,似乎BiMap<Object, Object> map = Maps.synchronizedBiMap(HashBiMap.create());
BiMap<Object, Object> inverse = map.inverse();
的{{1}}也是inverse()
,共享相同的SynchronizedBiMap
。这是否意味着所描述的问题不存在?非常感谢番石榴收藏专家的确认;)
答案 0 :(得分:0)
不,在这种情况下,您不必在反转的地图上进行同步。您仅引用了文档的一部分,我还将在示例代码中将原始keySet()
与inverse()
切换为:
返回由指定bimap支持的同步(线程安全)bimap。为了保证串行访问,必须通过返回的bimap完成对后备bimap的所有访问。
当访问任何集合视图时,用户必须手动同步返回的地图:
BiMap<Long, String> map = Maps.synchronizedBiMap( HashBiMap.<Long, String>create()); //... BiMap<String, Long> inverse = map.inverse(); // Needn't be in synchronized block Set<String> set = inverse.keySet(); // Needn't be in synchronized block //... synchronized (map) { // Synchronizing on map, not set! Iterator<String> it = set.iterator(); // Must be in synchronized block while (it.hasNext()) { foo(it.next()); } }
不遵循此建议可能会导致非确定性行为。
因此,当您希望在迭代过程中对其视图(包括迭代反向视图)中的确定性行为时,您必须在您的实例上进行同步。
如果你提到.inverse()
it creates new synchronized bimap using same mutex object,那么它会在get
或contains
等方法上正确同步。