List
ArrayList
- ArrayList不是线程安全的数据结构,在多线程下尽量减少使用,可以使用下面方法包装ArrayList,变为线性安全的
Collections.synchronizedList(List list)
CopyOnWriteArrayList
- 读取时:由于对象未发生改变,因此不需要加锁,性能高效
- 修改时:先获取对象的一个副本,然后对副本进行修改
Vector
- 读取:使用了同步关键字,所有的get()操作都必须先取得对象锁才能进行。在高并发的情况下,大量的锁竞争会拖累系统性能
- 修改:也使用了同步关键字,但是Vector相对于CopyOnWriteArrayList更加高效(Synchronization)
总结
- 读取更多时候,选择CopyOnWriteArrayList
- 修改更多时:选择Vector
Set
- 与List一样,也有一个包装类和CopyOnWriteArraySet
public static <T> Set<T> synchronizedSet(Set<T> s)
Map
- 可以使用synchronizedMap方法得到一个线程安全的Map,但是性能不是最优
- ConcurrentHashmap:性能高,get()方法无锁,专门为线程并发而设计的HashMap,整体性能优于同步的HashMap
Queue
ConcurrentLinkedQueue
- 适合高并发场景下的队列
- 通过无锁的方式实现
- 通常性能优于BlockingQueue
BlockingQueue
- 是一个阻塞队列的接口
- 主要作用是:简化多线程间的数据共享(重点),比如生产者和消费者模式中使用
- 可以延迟提取或者添加数据
- ArrayBlockingQueue:基于数组的阻塞队列
- LinkedBlockingQueue:基于链表的阻塞队列
Deque
双端队列:double - ended Queue,允许从头部或者尾部进行出队或者入队操作
常用的子类
- LinkedList:基于链表实现、但非线程安全
- ArrayDeque:基于数组实现、拥有高效的随机访问、更好的遍历性能,但非线程安全
- LinkedBlockingDeque:基于链表实现、虽然是线程安全的,但没有进行读写分离,他的性能表现远远低于LinkedBlockingQueue、CocurrentLinkedQueue