使用 ConcurrentHashMap、CopyOnWriteArrayList 等线程安全集合可避免并发修改异常;2. 通过 Collections.synchronized 包装传统集合,但复合操作需额外加锁;3. 显式使用 synchronized 或 ReentrantLock 控制访问;4. 避免遍历时修改集合结构,优先选用支持迭代安全的集合类型。

在多线程环境中修改集合时,如果不加控制,很容易引发 ConcurrentModificationException 或数据不一致问题。Java 提供了多种方式来安全地操作集合,关键在于选择合适的工具和策略。
使用线程安全的集合类
Java 并发包(java.util.concurrent)提供了专为多线程设计的集合实现:
- ConcurrentHashMap:替代 HashMap,支持高并发读写,采用分段锁或 CAS 操作提升性能。
- CopyOnWriteArrayList:适用于读多写少的场景,每次修改都会复制底层数组,保证遍历安全。
- ConcurrentLinkedQueue:无锁队列,适合高并发的生产者-消费者模型。
这些集合内部已处理同步逻辑,直接使用即可避免大多数线程安全问题。
使用 Collections.synchronized 包装
对于传统集合,可通过 Collections.synchronizedList、synchronizedMap 等方法包装成线程安全版本:
立即学习“Java免费学习笔记(深入)”;
List注意:虽然单个操作是同步的,但复合操作(如迭代)仍需手动加锁:
synchronized(list) { for (String s : list) { // 安全遍历 } }使用显式同步控制
在自定义逻辑中,可使用 synchronized 关键字或 ReentrantLock 保护共享集合:
- 将集合访问代码块包裹在 synchronized 块中,确保同一时间只有一个线程执行。
- 使用 ReentrantLock 可提供更灵活的锁控制,如尝试获取锁、超时等。
避免在遍历时修改集合
即使使用线程安全集合,也要避免在迭代过程中由其他线程修改结构。例如 CopyOnWriteArrayList 允许遍历时修改,但普通集合不行。若必须边遍历边改,应使用 Iterator.remove() 方法(前提是集合支持且在单一线程内操作)。
基本上就这些。选对集合类型,控制访问逻辑,就能在多线程下安全操作集合。










