JJava 知识库
JAVA INTERVIEW

高频面试题

Java集合进阶约 1 分钟

项目里有共享集合被多个线程读写,你会怎么判断该加锁还是换成并发集合?

参考回答约 1 分钟 · 口语表达
我的判断

选加锁还是并发集合,关键看业务操作的原子边界:单 key 更新可用并发集合,多步不变量仍需要锁或重新建模。

我会先把共享操作写出来,而不是从类名开始选。例如“给某个用户计数”可以用 ConcurrentHashMap.compute;“库存从 A 集合移到 B 集合且总量不变”跨了两个容器,换两个并发集合也不能保证原子性。

实际选择大致是:

  • 线程间传递任务,用 BlockingQueue,顺便获得背压;
  • 单 key 查改,用 ConcurrentHashMap 的原子 API;
  • 读多写极少且允许旧快照,用 CopyOnWrite;
  • 多步操作必须一起成功,用同一把边界清楚的锁,或把状态封装到单线程执行器。

锁的范围按业务不变量定,不按整个方法图省事。上线前会用并发测试验证丢更新、重复消费和死锁,并监控锁等待、队列长度,而不是只跑功能单测。