【发布时间】:2016-09-06 06:12:27
【问题描述】:
在调用ConcurrentMap.remove() 之前线程中的操作是否保证happen-before 在看到从另一个线程中删除之后的操作?
Documentation 表示关于放入集合中的对象:
将对象放入任何并发集合之前线程中的操作发生在另一个线程中从集合中访问或删除该元素之后的操作。
示例代码:
{
final ConcurrentMap map = new ConcurrentHashMap();
map.put(1, new Object());
final int[] value = { 0 };
new Thread(() -> {
value[0]++;
value[0]++;
value[0]++;
value[0]++;
value[0]++;
map.remove(1); // A
}).start();
new Thread(() -> {
if (map.get(1) == null) { // B
System.out.println(value[0]); // expect 5
}
}).start();
}
A 是否与 B 处于 happens-before 关系中?因此,程序是否应该只打印 5?
【问题讨论】:
-
鉴于您引用的文档,您为什么会有不同的想法?
-
@shmosel 这个特定的文本说明了放置对象之前的操作发生在之前,但没有关于移除对象之前的操作。
-
您从其他并发集合类型中挑选出
ConcurrentMap有什么特别的原因吗? -
@shmosel 我不确定我是否理解你的问题,但这是我在问题出现时使用的,也是我目前对答案感兴趣的。
标签: java concurrency