
在之前的文章中已經為大家介紹了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狀态的可能性,進而提高了線程并發執行的效率。
java并發程式設計工具類JUC第四篇:LinkedBlockingQueue連結清單隊列 - ArrayBlockingQueue底層代碼是采用數組實作的,建立的時候必須指定隊列的容量并配置設定存儲空間;LinkedBlockingQueue采用的是連結清單資料結構實作的,其連結清單節點的存儲空間配置設定是動态的,新的元素對象加入隊列配置設定空間,元素對象從隊列取出之後存儲空間GC,初始化時指定的是隊列的最大容量。但是使用連結清單資料結構既是LinkedBlockingQueue優勢也是它的劣勢,高并發場景下由于空間動态配置設定需要java JVM頻繁的進行垃圾回收。
總體來說在并發場景下,LinkedBlockingQueue的吞吐量比ArrayBlockingQueue更好。但是在java實作高性能隊列的首選是disruptor,它不是JDK自帶的。java程式員非常熟悉的Log4j2底層性能比logback和log4j有了較大的提升,究其原因就是使用了disruptor高性能隊列實作的異步日志
歡迎關注我的部落格,裡面有很多精品合集
- 本文轉載注明出處(必須帶連接配接,不能隻轉文字):字母哥部落格。
覺得對您有幫助的話,幫我點贊、分享!您的支援是我不竭的創作動力! 。另外,筆者最近一段時間輸出了如下的精品内容,期待您的關注。
- 《手摸手教你學Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《實戰前後端分離RBAC權限管理系統》
- 《實戰SpringCloud微服務從青銅到王者》
- 《VUE深入淺出系列》