java并發(fā)編程工具類JUC之LinkedBlockingQueue鏈表隊列
java.util.concurrent.LinkedBlockingQueue 是一個基于單向鏈表的、范圍任意的(其實是有界的)、FIFO阻塞隊列。訪問與移除操作是在隊頭進行,添加操作是在隊尾進行,并分別使用不同的鎖進行保護,只有在可能涉及多個節(jié)點的操作才同時對兩個鎖進行加鎖。
隊列是否為空、是否已滿仍然是通過元素數(shù)量的計數(shù)器(count)進行判斷的,由于可以同時在隊頭、隊尾并發(fā)地進行訪問、添加操作,所以這個計數(shù)器必須是線程安全的,這里使用了一個原子類 AtomicInteger,這就決定了它的容量范圍是: 1 ?Integer.MAX_VALUE。
在之前的文章中已經(jīng)為大家介紹了java并發(fā)編程的工具:BlockingQueue接口、ArrayBlockingQueue、DelayQueue。
LinkedBlockingQueue 隊列是BlockingQueue接口的實現(xiàn)類,所以它具有BlockingQueue接口的一切功能特點。LinkedBlockingQueue隊列 按照first-in-first-out (FIFO)先進先出的方式對元素進行排序。LinkeBlockingQueue 提供了兩種構(gòu)造函數(shù),一個構(gòu)造函數(shù)構(gòu)造一個隊列容量為固定個數(shù)的隊列,另一個無參構(gòu)造函數(shù)構(gòu)造一個隊列容量為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都是實現(xiàn)BlockingQueue接口,所以在使用方式上是一致的,下面我們就不介紹使用方法,而是從二者的性能及底層數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)角度進行
ArrayBlockingQueue插入和刪除數(shù)據(jù),只采用了一個lock鎖,讀取和寫入操作無法并行。 所以在高并發(fā)場景下執(zhí)行效率會比LinkedBlockingQueue慢一些。
LinkedBlockingQueue采用“two lock queue”算法變體,雙鎖(ReentrantLock):takeLock、putLock,允許讀寫并行,remove(e)和迭代器iterators需要獲取2個鎖。這樣可以降低線程由于線程無法獲取到lock而進入WAITING狀態(tài)的可能性,從而提高了線程并發(fā)執(zhí)行的效率。
ArrayBlockingQueue底層代碼是采用數(shù)組實現(xiàn)的,創(chuàng)建的時候必須指定隊列的容量并分配存儲空間;LinkedBlockingQueue采用的是鏈表數(shù)據(jù)結(jié)構(gòu)實現(xiàn)的,其鏈表節(jié)點的存儲空間分配是動態(tài)的,新的元素對象加入隊列分配空間,元素對象從隊列取出之后存儲空間GC,初始化時指定的是隊列的最大容量。但是使用鏈表數(shù)據(jù)結(jié)構(gòu)既是LinkedBlockingQueue優(yōu)勢也是它的劣勢,高并發(fā)場景下由于空間動態(tài)分配需要java JVM頻繁的進行垃圾回收。
總體來說在并發(fā)場景下,LinkedBlockingQueue的吞吐量比ArrayBlockingQueue更好。但是在java實現(xiàn)高性能隊列的首選是disruptor,它不是JDK自帶的。java程序員非常熟悉的Log4j2底層性能比logback和log4j有了較大的提升,究其原因就是使用了disruptor高性能隊列實現(xiàn)的異步日志
到此這篇關(guān)于java并發(fā)編程工具類JUC之LinkedBlockingQueue鏈表隊列的文章就介紹到這了,更多相關(guān)java LinkedBlockingQueue鏈表隊列內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. ASP.NET MVC遍歷驗證ModelState的錯誤信息2. 將properties文件的配置設(shè)置為整個Web應(yīng)用的全局變量實現(xiàn)方法3. asp(vbs)Rs.Open和Conn.Execute的詳解和區(qū)別及&H0001的說明4. jsp網(wǎng)頁實現(xiàn)貪吃蛇小游戲5. 用css截取字符的幾種方法詳解(css排版隱藏溢出文本)6. ASP 信息提示函數(shù)并作返回或者轉(zhuǎn)向7. asp中response.write("中文")或者js中文亂碼問題8. PHP設(shè)計模式中工廠模式深入詳解9. CSS hack用法案例詳解10. ThinkPHP5實現(xiàn)JWT Token認證的過程(親測可用)
