在看到从另一个线程中删除之后的操作之前,在调用之前的一个线程中的操作是否ConcurrentMap.remove()
保证发生?
有关放入集合中的对象的文档说明:
在将对象放入任何并发集合之前的线程中的操作发生在从另一个线程中的集合访问或移除该元素之后的操作之前.
示例代码:
{
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();
}
Run Code Online (Sandbox Code Playgroud)
是一个在之前发生有关系乙?因此,如果该程序只打印5?