溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

ConcurrentLinkedQueue和LinkedBlockingQueue如何使用

發(fā)布時間:2021-06-23 14:17:23 來源:億速云 閱讀:246 作者:Leah 欄目:大數(shù)據(jù)

今天就跟大家聊聊有關(guān)ConcurrentLinkedQueue和LinkedBlockingQueue如何使用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

ConcurrentLinkedQueue和LinkedBlockingQueue如何使用在Java多線程應用中,隊列的使用率很高,多數(shù)生產(chǎn)消費模型的首選數(shù)據(jù)結(jié)構(gòu)就是隊列(先進先出)。Java提供的線程安全的Queue可以分為阻塞隊列和非阻塞隊列,其中阻塞隊列的典型例子是BlockingQueue,非阻塞隊列的典型例子是ConcurrentLinkedQueue,在實際應用中要根據(jù)實際需要選用阻塞隊列或者非阻塞隊列。

注:什么叫線程安全?這個首先要明確。線程安全就是說多線程訪問同一代碼,不會產(chǎn)生不確定的結(jié)果。

并行和并發(fā)區(qū)別

1、并行是指兩者同時執(zhí)行一件事,比如賽跑,兩個人都在不停的往前跑;
2、并發(fā)是指資源有限的情況下,兩者交替輪流使用資源,比如一段路(單核CPU資源)同時只能過一個人,A走一段后,讓給B,B用完繼續(xù)給A ,交替使用,目的是提高效率

LinkedBlockingQueue
由于LinkedBlockingQueue實現(xiàn)是線程安全的,實現(xiàn)了先進先出等特性,是作為生產(chǎn)者消費者的首選,LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的話,默認最大是Integer.MAX_VALUE,其中主要用到put和take方法,put方法在隊列滿的時候會阻塞直到有隊列成員被消費,take方法在隊列空的時候會阻塞,直到有隊列成員被放進來。

ConcurrentLinkedQueue和LinkedBlockingQueue如何使用

ConcurrentLinkedQueue和LinkedBlockingQueue如何使用

ConcurrentLinkedQueue和LinkedBlockingQueue如何使用

ConcurrentLinkedQueue和LinkedBlockingQueue如何使用

ConcurrentLinkedQueue

ConcurrentLinkedQueue是Queue的一個安全實現(xiàn).Queue中元素按FIFO原則進行排序.采用CAS操作,來保證元素的一致性。
LinkedBlockingQueue是一個線程安全的阻塞隊列,它實現(xiàn)了BlockingQueue接口,BlockingQueue接口繼承自java.util.Queue接口,并在這個接口的基礎(chǔ)上增加了take和put方法,這兩個方法正是隊列操作的阻塞版本。

ConcurrentLinkedQueue和LinkedBlockingQueue如何使用ConcurrentLinkedQueue和LinkedBlockingQueue如何使用

運行結(jié)果:

costtime 2360ms

改用while (queue.size()>0)后
運行結(jié)果:
cost time 46422ms

結(jié)果居然相差那么大,看了下ConcurrentLinkedQueue的API原來.size()是要遍歷一遍集合的,難怪那么慢,所以盡量要避免用size而改用isEmpty().

總結(jié)了下, 在單位缺乏性能測試下,對自己的編程要求更加要嚴格,特別是在生產(chǎn)環(huán)境下更是要小心謹慎。

使用場景:

適用阻塞隊列的好處:多線程操作共同的隊列時不需要額外的同步,另外就是隊列會自動平衡負載,即那邊(生產(chǎn)與消費兩邊)處理快了就會被阻塞掉,從而減少兩邊的處理速度差距,自動平衡負載這個特性就造成它能被用于多生產(chǎn)者隊列,因為你生成多了(隊列滿了)你就要阻塞等著,直到消費者消費使隊列不滿你才可以繼續(xù)生產(chǎn)。 當許多線程共享訪問一個公共 collection 時,ConcurrentLinkedQueue 是一個恰當?shù)倪x擇。 
LinkedBlockingQueue 多用于任務(wù)隊列(單線程發(fā)布任務(wù),任務(wù)滿了就停止等待阻塞,當任務(wù)被完成消費少了又開始負載 發(fā)布任務(wù)) 
ConcurrentLinkedQueue 多用于消息隊列(多個線程發(fā)送消息,先隨便發(fā)來,不計并發(fā)的-cas特點)

多個生產(chǎn)者,對于LBQ性能還算可以接受;但是多個消費者就不行了mainLoop需要一個timeout的機制,否則空轉(zhuǎn),cpu會飆升的。LBQ正好提供了timeout的接口,更方便使用 如果CLQ,那么我需要收到處理sleep

看完上述內(nèi)容,你們對ConcurrentLinkedQueue和LinkedBlockingQueue如何使用有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI