和平精英地铁逃生正式服
1.96GB · 2025-10-01
原文来自于:[zha-ge.cn/java/38]zha-ge.cn/java/38)
“说出来你可能不信,我第一次遇见 CopyOnWriteArrayList,真有点像突然喝到了一杯奇葩口味咖啡。” 那天项目里一顿多线程操作 ArrayList,直接就炸了——各种 ConcurrentModificationException 扑面而来。眼看需求日期在逼近,我只能抱着百度拼命啃资料,终于,那个神秘的名字——CopyOnWriteArrayList,出现在我的面前。
这货的名字一看就不走寻常路:“写时复制”列表。跟平时 ArrayList 那种你加我加大家抢着改的作风完全不一样。 CopyOnWriteArrayList 的大法简单粗暴:只要有修改操作,比如 add 或 remove,它就直接把底层的数组“复制”一份,改完再换上。 读的时候,全世界读线程用的都是一个老版本的新数组,根本不用加锁。 写的时候,悄咪咪整出个新副本,等你们都读完了再说。
代码长这样:
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
list.add("程序员");
list.add("出门左转");
list.remove("左转");
// ...
嗯,是不是看着很清爽? 连 iterator 都不用担心:
for (String s : list) {
System.out.println(s);
// list.add("插队"); // 不会抛 ConcurrentModificationException
}
想当初用普通 ArrayList,改着改着分分钟爆炸。CopyOnWriteArrayList 则“稳如老狗”。
说起来简单,真用的时候,坑也是多得想抽自己耳光。
时间一久,我总结出一套“用 CopyOnWriteArrayList 的锦囊”:
适合这样:
说白了,CopyOnWriteArrayList 就是个谈恋爱怕闹分手的“安全派”: 你要改,我就自个儿带球跑路,剩下的你们慢慢看前任。 用得好,项目稳如老狗;用错场景,队友只会拿你祭天。
所以,下回再遇到多线程需要安全集合的场景,还得盘一盘,别再头铁乱撸 CopyOnWriteArrayList 啦!
——聊着聊着,咖啡快凉了,晚安,我的并发朋友们。