同步类容器是 线程安全 的,如 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数组
ConcurrentHashMap 容器内部使用(Segment)来表示不一样的部分,每一个段其实就是一个小的 HashTable ,它们有本身的锁。只要多个修改操做发生在不一样的段上,它们就能够并发进行。把一个总体分红了16个段(Segment)。也就是最高支持16个线程的并发修改操做。这也是在多线程场景时 减少锁的粒度从而下降锁竞争 一种方案。而且代码中大多共享变量使用 volatile 关键字声明,目的是第一时间获取修改的内容,性能很是好。安全
CopyOnWrite 容器既写时复制的容器, 用于读多写少的场景 。往一个容器添加元素时,不直接往当前容器添加,而是先将当前容器 Copy ,复制一个新的容器,而后往新的容器添加元素,添加完成以后,再将原容器的引用指向新的容器,这样作的好处是能够对 CopyOnWrite 容器进行并发的读,而不须要加锁,由于当前容器不会添加任何元素。因此 CopyOnWrite 容器是一种读写分离的思想,读和写不一样的容器。多线程
适合高并发场景下的队列,经过无锁的方式,实现了高并发状态下的高性能,一般 ConcurrentLinkedQueue 性能好于 LinkedBlockingQueue。它是一个基于连接节点的无界线程安全队列。该队列的元素遵循先进先出的原则,且不容许 null 元素。并发
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个阻塞队列,以下。
天天用心记录一点点。内容也许不重要,但习惯很重要!