JJava 知识库
JAVA INTERVIEW

高频面试题

Java集合基础约 1 分钟

线上出现 ConcurrentModificationException,你会怎么定位?换成并发集合就一定没问题吗?

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

ConcurrentModificationException 说明遍历期间集合结构被非预期修改,它是快速暴露 bug 的机制,不是线程安全保证。

我会从堆栈找到正在遍历的集合和修改位置,确认是同一个线程在 for-each 里直接 remove,还是另一个线程同时写。单线程删除可以改用 Iterator.remove()removeIf,或者遍历后统一处理;不要在 enhanced for 中直接改原集合。

如果是并发读写,先确定需要什么一致性。配置快照允许读到旧版本,可以用不可变集合原子替换;任务交接用并发队列;必须在一组元素上维持不变量时,仍然要加锁。

换成 ConcurrentHashMapCopyOnWriteArrayList 只会改变迭代语义:前者是弱一致,后者遍历旧快照,都不保证你“刚写的数据这次一定看到”。因此修复前会先写清业务对遍历结果的要求,而不是只消灭异常。

容易答偏踩坑误区
  • 捕获异常后继续循环。 集合状态和本次结果已经不可相信。
  • 认为没抛异常就线程安全。 fail-fast 是尽力检测,不是并发协议。
  • 直接换并发集合。 弱一致或快照语义可能让业务得到过期结果。