Java 中的 并发容器
1.List 类
list类 线程安全的主要有 Vector 与 CopyOnWriteArrayList
a). Vector
Vector 相当于在 原有 ArrayList类的基础上将所有方法 变成同步方法
同样的操作还有 Collections.synchronizedList() 方法,将原有List 方法包装成同步方法,
b). CopyOnWriteArrayList
CopyOnWriteArrayList 采用的是写时复制的方式,在redis的rdb持久化和nacos服务端注册新的服务时都有用到
读操作发生在原有数组上,写操作时将复制原数组,对新数组进行操作,当写操作执行完毕后,将原有指针指向新的数组 。 CopyOnWrite 类并发容器仅适合写操作少的场景,并且新增的元素不会被立马读取到
2.Map 类
a). HashTable
HashTable 底层与 HashMap 基本保存一致,唯一不同的是所有方法都用 synchronized 修饰
b). ConcurrentHashMap
ConcurrentHashMap 基于分段锁实现,大量使用了乐观锁和悲观锁
c). ConcurrentSkipListMap
ConcurrentSkipListMap 基于跳表实现,与ConcurrentHashMap相比,key是有序的
3.Set 类
a). CopyOnWriteArraySet
同步机制与 CopyOnWriteArrayList 一致
b). ConcurrentSkipListSet
同步机制与 ConcurrentSkipListMap 一致
4.Queue 类
Queue 分为 阻塞 与 非阻塞,单向 与 双向 ,有界 与 无界
阻塞指的是当队列已满时,入队操作阻塞;当队列已空时,出队操作阻塞
单向 指的是只能队尾入队,队首出队;而双向 指的是队首队尾皆可入队出队
阻塞队列 已 Blocking 标识,如常用 ArrayBlockingQueue ,LinkedBlockingQueue
单向队列 结尾为 Queue 如常用 ArrayBlockingQueue
双向队列 结尾为 Deque 如 LinkedBlockingDeque
有界队列只有 ArrayBlockingQueue 与 LinkedBlockingQueue,其余均为无界队列
使用无界队列需避免发生OOM