传统数据结构的问题
常用的数据结构,诸如HashMap
, ArrayList
, HashSet
都是非同步的,当多个线程进行读写,可能会抛出异常或数据错误,因此是线程不安全的。但是Java里面陈旧线程安全的数据结构,诸如HashTable
, Vector
, StringBuffer
等,性能过差。因此J.U.C
实现了一些新的同步数据结构,它们主要分为两类:
- 阻塞式集合: 当集合为空或满时,等待
- 非阻塞式集合: 当集合为空或满时,不等待,直接返回null或者异常
并发数据结构包括的类型
List类
- Vector: 同步安全,写多读少
- ArrayList:不安全
- Collection.SynchronizedList(List list) :可以把一个线程不安全的List变成线程安全的,但是使用Synchronized效率较低
- CopyOnWriteArrayList,:Java5提供的线程安全的列表类,基于复制机制,非阻塞,适合用于读多写少的场景,性能较好
Set类
- HashSet 不安全
- Collection.SynchronizedSet(Set set): 同上,效率低
- CopyOnWriteArraySet