> 文章列表 > Java中的并发容器

Java中的并发容器

Java中的并发容器

Java 中的 并发容器

1.List 类

list类 线程安全的主要有 Vector 与 CopyOnWriteArrayList

a). Vector

Vector 相当于在 原有 ArrayList类的基础上将所有方法 变成同步方法

Java中的并发容器

同样的操作还有 Collections.synchronizedList() 方法,将原有List 方法包装成同步方法,

Java中的并发容器

b). CopyOnWriteArrayList

CopyOnWriteArrayList 采用的是写时复制的方式,在redis的rdb持久化和nacos服务端注册新的服务时都有用到

读操作发生在原有数组上,写操作时将复制原数组,对新数组进行操作,当写操作执行完毕后,将原有指针指向新的数组 。 CopyOnWrite 类并发容器仅适合写操作少的场景,并且新增的元素不会被立马读取到

Java中的并发容器

2.Map 类

a). HashTable

HashTable 底层与 HashMap 基本保存一致,唯一不同的是所有方法都用 synchronized 修饰

Java中的并发容器

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