ConcurrentHashMap 多个 key 如何实现原子操作?
在使用 ConcurrentHashMap 时,ConcurentHashMap 通过 CAS 保证了操作的线程安全。但是当我们需要进行多个操作和复合操作时,ConcurentHashMap 并不能保证操作的原子性:get 和 put 分别是线程安全的,然而当我们先 get 后 put 操作时,从 get 到 put 的过程中间,其他线程可能已经修改了这个key对应的值。ConcurrentHashMap 通过 compute 提供了单个 key 的原子操作,然而当我们需要操作多个 key 时,compute 无法支持。现在我的业务场景需要将多个 key 原子地写入 ConcurentHashMap,当某个key已存在时,则所有 key 均不写入。我可以怎么样尽可能高性能地实现呢?
我考虑过:
- 整个 map 加锁,但是这样锁的粒度太大了,性能影响太大。
- 对需要操作的键加锁,这就不如直接不使用ConcurrentHashMap了。
回复
1个回答

test
2024-08-11
使用CopyOnWriteArraySet保存已有的keys,写ConcurentHashMap之前,先判断Set是否存在需要写入的keys,如果不存在则立刻先写Set,再写Map
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容