CopyOnWriteArrayList 原理
面试官问:"CopyOnWriteArrayList 是怎么实现线程安全的?"
候选人小方答:"每次写入时复制一份数据。"
面试官追问:"为什么读取不需要加锁?"
小方说:"因为...数据是最终一致的?"
面试官又问:"那它适合什么场景?"
小方答不上来。
【面试官心理】 CopyOnWriteArrayList 是一个经典的"空间换时间"的并发集合。能说出"读多写少"作为适用场景,并理解"读写分离"原理的候选人,说明对并发设计模式有积累。
一、核心原理:写时复制 🔴
读写流程对比
二、数据一致性分析 🔴
2.1 弱一致性
2.2 为什么可以接受
适合的场景:
- 读远多于写(如配置信息、规则列表)
- 短暂读到旧数据可以接受
- 不需要实时一致性
不适合的场景:
- 写操作需要立刻被读到
- 需要精确计数
- 业务数据需要强一致性
三、性能特点 🟡
3.1 读性能
3.2 写性能
3.3 内存开销
四、适用场景 🟡
4.1 配置信息管理
4.2 监听器列表
4.3 不适合的场景
五、与 ConcurrentHashMap 对比 🟡
六、追问升级
面试官:"CopyOnWriteArrayList 的迭代器是 fail-safe 还是 fail-fast?"
答案:CopyOnWriteArrayList 的迭代器是 fail-safe(安全失败),因为它遍历的是数组的快照,而不是实时数据。
【面试官心理】 能说出 fail-safe 和 fail-fast 区别,并解释 CopyOnWriteArrayList 迭代器行为的候选人,说明对并发集合的迭代器机制有深入理解。