Java中并发Multimap的线程安全添加操作

3

我希望在Java中拥有一个并发的多重映射(从键到值列表的映射),类似于以下内容:

var map = new ConcurrentHashMap<String, List<String>>();

以下操作是线程安全的吗?还是在并发更新的情况下存在竞争条件和丢失一个值的可能性?
map.computeIfAbsent(key, k -> new CopyOnWriteArrayList<>()).add(value);

据我所知,第一个操作computeIfAbsent()是原子的,因此不可能有两个线程运行此代码并获得不同的ArrayList实例,返回的CopyOnWriteArrayList实例也是线程安全的,因此add()应该没问题。我的推理正确吗?

不确定一个线程安全的List实现在这里会有什么好处。我猜你想要一个不可变的列表,以便它不能在映射之外被修改。但这只是我的猜测。 - forty-two
1个回答

4

computeIfAbsent() 方法是线程安全的。

根据 javadoc 的说明,该方法会原子执行。

整个方法调用原子性地执行,因此函数每个键最多只应用一次。其他线程在计算过程中对该映射的某些尝试更新操作可能会被阻塞,因此计算应该简短而简单,并且不得尝试更新该映射的任何其他映射。

结果,该映射将被更新,或者现有列表将被检索。整个过程将作为单个操作完成。因此,没有数据会丢失,因为每个线程将获得相同的列表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接