JUC源码分析-集合篇:并发类容器介绍

JUC源码分析-集合篇:并发类容器介绍

同步类容器是 线程安全 的,如 Vector、HashTable 等容器的同步功能都是由 Collections.synchronizedMap 等工厂方法去建立实现的,底层使用 synchronized 关键字,每次只有一个线程访问容器。这明显不知足高并发的需求。html

JDK1.8 中的并发类容器java

非阻塞队列 阻塞队列
ConcurrentHashMap [ArrayBlockingDeque]
[ConcurrentSkipListMap] LinkedBlockingQueue
[ConcurrentSkipListSet] LinkedBlockingDeque
ConcurrentLinkedQueue PriorityBlockingQueue
ConcurrentLinkedDeque DelayQueue
CopyOnWriteArrayList SynchronousQueue
CopyOnWriteArraySet LinkedTransferQueue

《Java并发容器使用》:http://tutorials.jenkov.com/java-util-concurrent/index.html数组

1. ConcurrentMap

ConcurrentHashMap 容器内部使用(Segment)来表示不一样的部分,每一个段其实就是一个小的 HashTable ,它们有本身的锁。只要多个修改操做发生在不一样的段上,它们就能够并发进行。把一个总体分红了16个段(Segment)。也就是最高支持16个线程的并发修改操做。这也是在多线程场景时 减少锁的粒度从而下降锁竞争 一种方案。而且代码中大多共享变量使用 volatile 关键字声明,目的是第一时间获取修改的内容,性能很是好。安全

2. Copy-On-Write

CopyOnWrite 容器既写时复制的容器, 用于读多写少的场景 。往一个容器添加元素时,不直接往当前容器添加,而是先将当前容器 Copy ,复制一个新的容器,而后往新的容器添加元素,添加完成以后,再将原容器的引用指向新的容器,这样作的好处是能够对 CopyOnWrite 容器进行并发的读,而不须要加锁,由于当前容器不会添加任何元素。因此 CopyOnWrite 容器是一种读写分离的思想,读和写不一样的容器。多线程

3. ConcurrentLinkedQueue 无阻塞队列

适合高并发场景下的队列,经过无锁的方式,实现了高并发状态下的高性能,一般 ConcurrentLinkedQueue 性能好于 LinkedBlockingQueue。它是一个基于连接节点的无界线程安全队列。该队列的元素遵循先进先出的原则,且不容许 null 元素。并发

4. BlockingQueue 阻塞队列

Java 中阻塞队列的 4 种处理方式,JDK1.8 提供了 中提供的 7 种阻塞队列。高并发

阻塞队列(BlockingQueue)是一个支持两个附加操做的队列。这两个附加的操做支持阻塞的插入和移除方法。源码分析

1)支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满。
2)支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空。性能

阻塞队列经常使用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。阻塞队列就是生产者用来存放元素、消费者用来获取元素的容器。在阻塞队列不可用时,这两个附加操做提供了 4 种处理方式,以下表所示。线程

方法 抛出异常 返回特殊值 一直阻塞 超时退出
插入 add(e) offer(e) put(e) offer(e, time, unit)
移除 remove(e) poll() take() poll(time, unit)
查找 element() peek() × ×

JDK 7提供了7个阻塞队列,以下。

  1. ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列。
  2. LinkedBlockingQueue:一个由链表结构组成的有界阻塞队列。
  3. PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列。
  4. DelayQueue:一个使用优先级队列实现的无界阻塞队列。
  5. SynchronousQueue:一个不存储元素的阻塞队列。
  6. LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。
  7. LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。

天天用心记录一点点。内容也许不重要,但习惯很重要!

相关文章
相关标签/搜索