Java ConcurrentHashMap.computeIfPresent value modification visibility
假设我有一个并发地图,集合作为值:
Map<Integer, List<Integer> map = new ConcurrentHashMap<>();
map.putIfAbsent(8, new ArrayList<>());
我更新了值,如下所示:
map.computeIfPresent(8, (i, c) -> {
c.add(5);
return c;
});
我知道整个方法调用都是以原子方式执行的。但是,考虑到此映射由多个线程同时访问,我有点担心对基础集合所做的修改的数据可见性。在这种情况下,调用后,值 5 将在列表中显示computeIfPresent
map.get
我的问题是,如果在方法调用中执行更改,则在调用时,是否会在其他线程中显示对列表的更改。map.get
computeIfPresent
请注意,我知道如果我在执行更新操作之前参考列表,则对列表的更改将不可见。我不确定如果我在更新操作后引用列表(通过调用),对列表的更改是否可见。map.get
我不确定如何解释文档,但在我看来,在这种特殊情况下,发生之前的关系将保证对基础集合的更改的可见性。
更正式地说,给定密钥的更新操作与报告更新值的该密钥的任何(非空)检索都具有发生之前关系