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