同步類容器是 線程安全 的,如 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個阻塞隊列,以下。
天天用心記錄一點點。內容也許不重要,但習慣很重要!