同步BiMap的逆视图同步

时间:2017-05-18 14:42:28

标签: java guava bimap

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。这是否意味着所描述的问题不存在?非常感谢番石榴收藏专家的确认;)

1 个答案:

答案 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,那么它会在getcontains等方法上正确同步。