java併發程式設計工具類JUC第四篇:LinkedBlockingQueue連結串列佇列
在之前的文章中已經為大家介紹了java併發程式設計的工具:BlockingQueue介面、ArrayBlockingQueue、DelayQueue。
LinkedBlockingQueue 佇列是BlockingQueue介面的實現類,所以它具有BlockingQueue介面的一切功能特點。LinkedBlockingQueue佇列 按照first-in-first-out (FIFO)先進先出的方式對元素進行排序。LinkeBlockingQueue 提供了兩種建構函式,一個建構函式構造一個佇列容量為固定個數的佇列,另一個無參建構函式構造一個佇列容量為Integer.MAX_VALUE
的佇列.
public LinkedBlockingQueue() {
this(Integer.MAX_VALUE);
}
public LinkedBlockingQueue(int capacity) {
if (capacity <= 0) throw new IllegalArgumentException();
this.capacity = capacity;
last = head = new Node<E>(null);
}
ArrayBlockingQueue和LinkedBlockingQueue對比
ArrayBlockingQueue和LinkedBlockingQueue都是實現BlockingQueue介面,所以在使用方式上是一致的,下面我們就不介紹使用方法,而是從二者的效能及底層資料結構的實現角度進行
- ArrayBlockingQueue插入和刪除資料,只採用了一個lock鎖,讀取和寫入操作無法並行。 所以在高併發場景下執行效率會比LinkedBlockingQueue慢一些。
-
LinkedBlockingQueue採用“two lock queue”演算法變體,雙鎖(ReentrantLock):takeLock、putLock,允許讀寫並行,remove(e)和迭代器iterators需要獲取2個鎖。這樣可以降低執行緒由於執行緒無法獲取到lock而進入WAITING狀態的可能性,從而提高了執行緒併發執行的效率。
-
ArrayBlockingQueue底層程式碼是採用陣列實現的,建立的時候必須指定佇列的容量並分配儲存空間;LinkedBlockingQueue採用的是連結串列資料結構實現的,其連結串列節點的儲存空間分配是動態的,新的元素物件加入佇列分配空間,元素物件從佇列取出之後儲存空間GC,初始化時指定的是佇列的最大容量。但是使用連結串列資料結構既是LinkedBlockingQueue優勢也是它的劣勢,高併發場景下由於空間動態分配需要java JVM頻繁的進行垃圾回收。
總體來說在併發場景下,LinkedBlockingQueue的吞吐量比ArrayBlockingQueue更好。但是在java實現高效能佇列的首選是disruptor,它不是JDK自帶的。java程式設計師非常熟悉的Log4j2底層效能比logback和log4j有了較大的提升,究其原因就是使用了disruptor高效能佇列實現的非同步日誌
歡迎關注我的部落格,裡面有很多精品合集
本文轉載註明出處(必須帶連線,不能只轉文字):字母哥部落格 - zimug.com
覺得對您有幫助的話,幫我點贊、分享!您的支援是我不竭的創作動力! 。另外,筆者最近一段時間輸出瞭如下的精品內容,期待您的關注。
- 長篇圖解java反射機制及其應用場景
- 併發程式設計系列之Lock鎖可重入性與公平性
- java併發程式設計JUC第十二篇:AtomicInteger原子整型
- java併發程式設計JUC第十一篇:如何線上程之間進行對等資料交換
- java併發程式設計JUC第十篇:CyclicBarrier執行緒同步
- java併發程式設計JUC第九篇:CountDownLatch執行緒同步
- java併發程式設計JUC第八篇:ConcurrentHashMap
- java併發程式設計工具類JUC第七篇:BlockingDeque雙端阻塞佇列
- java併發程式設計工具類JUC第六篇:SynchronousQueue同步佇列
- java併發程式設計工具類JUC第五篇:PriorityBlockingQueue優先順序佇列
- java併發程式設計工具類JUC第四篇:LinkedBlockingQueue連結串列佇列
- java併發程式設計工具類JUC第三篇:DelayQueue延時佇列
- java併發程式設計工具類JUC第二篇:ArrayBlockingQueue
- java併發程式設計工具類JUC第一篇:BlockingQueue阻塞佇列
- 快速入門Redis呼叫Lua指令碼及使用場景介紹
- Mybatis plus通用欄位自動填充的最佳實踐總結
- 詳解執行緒池的作用及Java中如何使用執行緒池
- Java9系列第九篇-對HTTP2協議的支援與非阻塞HTTP-API
- 跨站資源共享CORS原理深度解析
- 你以前看的執行緒狀態轉換圖可能都是錯的-圖解併發程式設計第二篇