我希望在Java中拥有一个并发的多重映射(从键到值列表的映射),类似于以下内容:
var map = new ConcurrentHashMap<String, List<String>>();
以下操作是线程安全的吗?还是在并发更新的情况下存在竞争条件和丢失一个值的可能性?
map.computeIfAbsent(key, k -> new CopyOnWriteArrayList<>()).add(value);
据我所知,第一个操作
computeIfAbsent()
是原子的,因此不可能有两个线程运行此代码并获得不同的ArrayList实例,返回的CopyOnWriteArrayList
实例也是线程安全的,因此add()
应该没问题。我的推理正确吗?