JUC包下的并发容器
并发容器是解决多线程情况下,可以处理的集合。
对于分别有
List
-
copyOnWriteArrayList
Set -
copyOnWriteArraySet
-
concurrentSkipSet
Map -
concurrentHashMap
-
concurrentSkipListMap
Queue
- BlockingQueue
- ConcurrentLinkedQueue
- BlockingDeque
- ConcurrentLinkedDeque
CopyOnWriteArrayList
原理:利用高并发往往是读多写少的特性,对读操作不加锁,对写操作,先复制一份新的集合,在新的集合上面修改,然后将新集合赋值给旧的引用。主要场景是读多写少的。
在新增数据的时候操作为
- 加锁
- 从原数据中拷贝出新数组
- 在新数组中进行操作,并把新数组赋值给数组容器
- 解锁
ConcurrentHashMap
数据结构,在1.8版本后为自旋+CAS+synchronized关键字来实现同步
阻塞队列
BlockingQueue是juc喜爱的数据结构,提供了线程安全的队列访问。
应用场景包括
- 线程池:任务队列通常是一个阻塞队列
- 消息队列
- 缓存系统
ArrayBlockingQueue
是有界阻塞队列,其内部是用数组存储元素的,初始化时需要制定容量大小,利用ReentrantLocak实现线程安全。
ArrayBlockingQueue使用独占锁ReentrantLock实现线程安全,入队和出队操作使用同一个锁对象,也就是只能有一个线程可以进行入队或者出队操作;这也就意味着生产者和消费者无法并行操作,在高并发场景下会成为性能瓶颈
LinkedBlockingQueue
原理
内部由单链表实现,只能从head取元素,从tail添加元素
LinkedBlockingQueue采用两把锁的锁分离技术实现入队出队互不阻塞,添加元素和获取元素都有独立的锁,也就是说LinkedBlockingQueue是读写分离的,读写操作可以并行执行
更多推荐


所有评论(0)