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:一個由鏈表結構組成的雙向阻塞隊列。

天天用心記錄一點點。內容也許不重要,但習慣很重要!

相關文章
相關標籤/搜索