Maps.synchronizedBiMap()方法指出:
在访问任何集合视图时,用户必须在返回的映射上手动同步。
这包括BiMap的BiMap视图吗?例如,如果像下面的示例一样初始化了变量,那么从其他线程调用inverse.put()会有问题吗(例如,在map或inverse上的get()调用中看不到更改,即使put发生在get之前)?
BiMap<Object, Object> map = Maps.synchronizedBiMap(HashBiMap.create());
BiMap<Object, Object> inverse = map.inverse();如果这实际上是一个问题,是否有一个标准/建议的方法来解决这个问题?
//编辑
从实现上看,似乎inverse() of a SynchronizedBiMap也是SynchronizedBiMap,共享相同的mutex。这是否意味着所描述的问题根本不存在?如能得到番石榴收藏品专家的确认,将不胜感激;)
发布于 2017-05-18 15:33:45
不,在这种情况下,您不必在倒置地图上同步。您只引用了文档的一个片段,我还将在示例代码中使用inverse()切换原始的inverse():
返回由指定bimap支持的同步(线程安全) bimap。为了保证串行访问,必须通过返回的bimap完成对备份bimap的所有访问。 在访问其集合视图时,用户必须手动同步返回的地图: BiMap map = Maps.synchronizedBiMap( HashBiMap.create());//.BiMap反向= map.inverse();//不必在同步块集中= inverse.keySet();//不必在同步块/.同步(映射){ //同步在地图上,未设置!Iterator it = set.iterator();//必须处于同步块中,而(it.hasNext()) { foo(it.next());} 不遵守这一建议可能会导致不确定的行为。
因此,当您想要在迭代期间对其视图进行确定性行为(包括迭代反向视图)时,您必须对实例进行同步。
对于.inverse(),正如您所提到的,它使用相同的互斥对象创建新的同步bimap。,因此它在get或contains之类的方法上正确地同步。
https://stackoverflow.com/questions/44050911
复制相似问题