项目里有共享集合被多个线程读写,你会怎么判断该加锁还是换成并发集合?
我的判断
选加锁还是并发集合,关键看业务操作的原子边界:单 key 更新可用并发集合,多步不变量仍需要锁或重新建模。
我会先把共享操作写出来,而不是从类名开始选。例如“给某个用户计数”可以用 ConcurrentHashMap.compute;“库存从 A 集合移到 B 集合且总量不变”跨了两个容器,换两个并发集合也不能保证原子性。
实际选择大致是:
- 线程间传递任务,用
BlockingQueue,顺便获得背压; - 单 key 查改,用 ConcurrentHashMap 的原子 API;
- 读多写极少且允许旧快照,用 CopyOnWrite;
- 多步操作必须一起成功,用同一把边界清楚的锁,或把状态封装到单线程执行器。
锁的范围按业务不变量定,不按整个方法图省事。上线前会用并发测试验证丢更新、重复消费和死锁,并监控锁等待、队列长度,而不是只跑功能单测。