Collections.synchronizedList通过同步方法实现线程安全,但迭代需手动加锁,适用于读多写少场景,高并发下性能不如CopyOnWriteArrayList。
在多线程环境下,普通的 ArrayList 是不安全的,多个线程同时读写可能导致数据不一致或抛出异常。Java 提供了 Collections.synchronizedList 方法来包装非线程安全的 List,使其在特定条件下线程安全。
使用方式如下:
Listlist = Collections.synchronizedList(new ArrayList<>());
此时,list 的 add、get、remove 等基本操作都是同步的,可以在多线程中安全调用。
例如,遍历时如果不加锁,可能抛出 ConcurrentModificationException 或读到不一致的数据:
synchronized (list) {
for (String item : list) {
System.out.println(item);
}
}
官方文档明确指出:对返回的列表进行**迭代时必须手动同步**,推荐在 synchronized 块中进行。
edList 适合低并发、读多写少的场景。它的实现简单,但性能较差,因为整个列表的方法都使用同一把锁,写操作会阻塞所有其他操作。
如果写操作较频繁,CopyOnWriteArrayList 的复制成本高,反而不如 synchronizedList。
基本上就这些。使用 Collections.synchronizedList 能让 List 基本操作线程安全,但别忘了手动同步复合操作。