java.util.concurrent包下集合類的特點與適用場景


java.util.concurrent包,此包下的集合都不允許添加null元素

序號 接口 特性 適用場景
1 Queue、Collection ArrayBlockingQueue 有界、阻塞、線程安全、FIFO 生產者、消費者場景比較合適,並且支持FIFO
2 Queue LinkedTransferQueue 阻塞、線程安全、FIFO

LinkedTransferQueue實現了一個重要的接口TransferQueue,該接口含有下面幾個重要方法:
1. transfer(E e):若當前存在一個正在等待獲取的消費者線程,即立刻移交之;否則,會插入當前元素e到隊列尾部,並且等待進入阻塞狀態,到有消費者線程取走該元素。
2. tryTransfer(E e):若當前存在一個正在等待獲取的消費者線程(使用take()或者poll()函數),使用該方法會即刻轉移/傳輸對象元素e;若不存在,則返回false,並且不進入隊列。這是一個不阻塞的操作。
3. tryTransfer(E e, long timeout, TimeUnit unit):若當前存在一個正在等待獲取的消費者線程,會立即傳輸給它;否則將插入元素e到隊列尾部,並且等待被消費者線程獲取消費掉;若在指定的時間內元素e無法被消費者線程獲取,則返回false,同時該元素被移除。
4. hasWaitingConsumer():判斷是否存在消費者線程。
5. getWaitingConsumerCount():獲取所有等待獲取元素的消費線程數量。

3 Queue PriorityBlockingQueue 阻塞、優先級 要使用FIFO,您需要插入一個新的FIFOEntry(anEntry),而不是普通的entry對象
4 Queue SynchronousQueue 阻塞、FIFO、線程安全、同步隊列 只允許一個值添加、取出,無容量
5 Queue ConcurrentLinkedQueue 線程安全、FIFO 線程安全,但一邊遍歷一邊poll還是不行的
6 Deque ConcurrentLinkedDeque 線程安全、鏈表 鏈表式操作,可對隊首隊尾直接操作
7 Map ConcurrentHashMap 非阻塞、線程安全  
8 Map ConcurrentSkipListMap 線程安全 構造函數支持排序,甚至可按照復合類型字段排序
9 Map ConcurrentSkipListSet 線程安全

構造函數支持排序,甚至可按照復合類型字段排序

10 List CopyOnWriteArrayList 線程安全

1、讀寫分離,讀和寫分開,需要讀和寫時都是對拷貝的副本進行操作。 
2、最終一致性 
缺點:
1、由於寫操作的時候,需要拷貝數組,會消耗內存,如果原數組的內容比較多的情況下,可能導致young gc或者full gc
2、不能用於實時讀的場景,像拷貝數組、新增元素都需要時間,所以調用一個set操作后,讀取到數據可能還是舊的,雖然CopyOnWriteArrayList 能做到最終一致性,但是還是沒法滿足實時性要求;
3、CopyOnWriteArrayList 合適讀多寫少的場景,不過這類慎用 
因為誰也沒法保證CopyOnWriteArrayList 到底要放置多少數據,萬一數據稍微有點多,每次add/set都要重新復制數組,這個代價實在太高昂了。在高性能的互聯網應用中,這種操作分分鍾引起故障。
參考網址:https://blog.csdn.net/linsongbin1/article/details/54581787

11 Set CopyOnWriteArraySet 線程安全 1、讀寫分離,讀和寫分開,需要讀和寫時都是對拷貝的副本進行操作。 
2、不存儲重復對象
3、最終一致性
12 Queue DelayQueue 阻塞、線程安全、FIFO 某對象在getDelay方法返回0或者負數時,才能從take方法中獲取到值,否則一直阻塞
13 Queue LinkedBlockingQueue 有界、阻塞、線程安全、FIFO、鏈表  
14 Deque LinkedBlockingDeque 有界、阻塞、線程安全、FIFO、鏈表  

  

Queue和Deque的區別

Deque不僅具有FIFO的Queue實現,也有FILO的實現,也就是不僅可以實現隊列,也可以實現一個堆棧。LinkedBlockingQueue和LinkedBlockingDeque的區別能比較好地體現Queue和Deque接口的區別。

參考網址:https://blog.csdn.net/vernonzheng/article/details/8267541  

 

ArrayBlockingQueue和LinkedBlockingQueue的區別
1. 隊列中鎖的實現不同
  ArrayBlockingQueue實現的隊列中的鎖是沒有分離的,即生產和消費用的是同一個鎖;
  LinkedBlockingQueue實現的隊列中的鎖是分離的,即生產用的是putLock,消費是takeLock
2. 在生產或消費時操作不同
  ArrayBlockingQueue實現的隊列中在生產和消費的時候,是直接將枚舉對象插入或移除的;
  LinkedBlockingQueue實現的隊列中在生產和消費的時候,需要把枚舉對象轉換為Node<E>進行插入或移除,會影響性能
3. 隊列大小初始化方式不同
  ArrayBlockingQueue實現的隊列中必須指定隊列的大小;
  LinkedBlockingQueue實現的隊列中可以不指定隊列的大小,但是默認是Integer.MAX_VALUE

參考網址:https://blog.csdn.net/ustc_zn/article/details/54864244 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM