JJava 知识库
JAVA INTERVIEW

高频面试题

Java集合进阶约 1 分钟

配置监听器和事件订阅列表读多写少,你会考虑 CopyOnWriteArrayList 吗?它的边界是什么?

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

监听器列表小、读取极多、注册极少时我会用 CopyOnWriteArrayList;写频繁或元素很多时不会用。

配置监听器和事件订阅者很符合它的典型场景:发布事件时只读一个稳定数组,不加锁;注册或注销监听器时复制整份数组,再原子替换。遍历中的线程继续看旧快照,因此不会抛并发修改异常,也不会看到半次更新。

它的代价也很明确:每次写都是 O(n) 复制,写入瞬间新旧数组同时占内存,而且新注册的监听器不保证被当前这轮遍历看到。列表有几万个元素或动态订阅很频繁时,这个成本不可接受。

我会先看三个指标:列表大小、每秒写次数、是否允许一次旧快照。如果不满足读多写少,会改成带锁的普通列表、按 key 分组的并发结构,或者让订阅变更串行化。

CopyOnWriteArrayList 解决的是遍历与修改的并发,不会替你处理监听器重复注册、执行超时和异常隔离。