线程安全的集合有哪些?
1 个回答
首先你要快乐,其次都是其次。木兰Java 里常见的**线程安全集合**可以按两大类来记: ## 1. **老版同步集合(`java.util`,通过 synchronized 实现)** 这些集合本身就加了同步锁,适合并发量不高的场景: * **List 系列** * `Vector`(古早版同步 List) * `Stack`(继承自 Vector) * **Map 系列** * `Hashtable`(古早版同步 Map) * **其他** * `Properties`(继承自 Hashtable) 特点: * 所有方法都 `synchronized` * 并发高时锁竞争严重,性能差 ## 2. **并发集合(`java.util.concurrent`,更高效)** 这些集合用分段锁、CAS 等方式提升了并发性能,是现在的首选: ### 2.1 List * `CopyOnWriteArrayList` * 读多写少场景 * 写操作复制一份新数组再替换,读操作无锁 ### 2.2 Map * `ConcurrentHashMap` * JDK 8 起用 **CAS + synchronized(桶级锁)** 实现,替代 Hashtable * 高并发下性能好,允许多个线程同时操作不同桶 ### 2.3 Set * `CopyOnWriteArraySet`(基于 `CopyOnWriteArrayList`) * `ConcurrentSkipListSet`(基于跳表,支持排序) * `Collections.newSetFromMap(new ConcurrentHashMap<>())` ### 2.4 Queue / Deque * **阻塞队列**(支持生产者-消费者模型): * `ArrayBlockingQueue`(数组结构,有界) * `LinkedBlockingQueue`(链表结构,有界) * `PriorityBlockingQueue`(优先级队列,无界) * `DelayQueue`(延时队列) * `SynchronousQueue`(不存数据,直接交付) * **并发非阻塞队列**: * `ConcurrentLinkedQueue`(单向链表) * `ConcurrentLinkedDeque`(双向链表) ### 2.5 排序容器(并发) * `ConcurrentSkipListMap`(基于跳表的有序 Map) * `ConcurrentSkipListSet`(基于跳表的有序 Set) ## 3. **普通集合的同步包装** 如果已有普通集合,也可以用 `Collections.synchronizedXxx` 包装成线程安全版本: ```java List<String> syncList = Collections.synchronizedList(new ArrayList<>()); Map<String, String> syncMap = Collections.synchronizedMap(new HashMap<>()); ``` 特点: * 也是用 `synchronized` 包一层,性能和老版同步集合类似 * 迭代时仍需手动加锁 **总结口诀**: > 老集合(Vector、Hashtable)→ 全方法加锁; > 新并发集合(ConcurrentHashMap、CopyOnWriteArrayList、阻塞队列、跳表)→ 更细粒度锁 + CAS; > 普通集合 → `Collections.synchronizedXxx` 包装。编辑于 2025-08-12 11:14 •IP属地 北京举报评论收藏
公众号进入网站体验更佳

