【发布时间】:2017-05-18 14:42:27
【问题描述】:
Maps.synchronizedBiMap() 方法声明
用户必须在返回的地图上手动同步 访问其任何集合视图时。
这是否包括 BiMap 的 inverse() 视图?例如,如果变量按照以下示例进行初始化,从其他线程调用 inverse.put() 可能会出现问题(例如,更改在 map 或 inverse 上的 get() 调用中不可见,即使 @ 987654327@ 之前发生过 get)?
BiMap<Object, Object> map = Maps.synchronizedBiMap(HashBiMap.create());
BiMap<Object, Object> inverse = map.inverse();
如果这确实是一个问题,是否有解决此问题的标准/推荐方法?
// 编辑
查看实现,似乎SynchronizedBiMap 的inverse() 也是SynchronizedBiMap,共享相同的mutex。这是否意味着所描述的问题不存在?非常感谢 Guava Collections 专家的确认;)
【问题讨论】:
-
所描述的问题从您引用的句子后面的示例中显而易见:在视图上迭代(或执行任何操作序列)时,您需要在同步的 BiMap 上同步整个迭代(或序列)以获得确定性行为。
-
与所有视图一样,手动同步仅在迭代时需要,逆向迭代时也需要。您不必同步,例如keySet.包含任何一个。
-
@LouisWasserman 如果要迭代逆,应该在逆映射上同步还是在原始映射上同步?
-
在原图上同步。原始映射是其自身及其所有视图(包括逆视图)的互斥体。