中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

ConcurrentLinkedQueue和LinkedBlockingQueue如何使用

發布時間:2021-06-23 14:17:23 來源:億速云 閱讀:248 作者:Leah 欄目:大數據

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

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

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

并行和并發區別

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

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

ConcurrentLinkedQueue和LinkedBlockingQueue如何使用

ConcurrentLinkedQueue和LinkedBlockingQueue如何使用

ConcurrentLinkedQueue和LinkedBlockingQueue如何使用

ConcurrentLinkedQueue和LinkedBlockingQueue如何使用

ConcurrentLinkedQueue

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

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

運行結果:

costtime 2360ms

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

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

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

使用場景:

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

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

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

向AI問一下細節

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

AI

苏尼特左旗| 西丰县| 吕梁市| 东兰县| 金平| 万盛区| 上饶县| 松原市| 嘉黎县| 修武县| 博客| 昭平县| 黑河市| 白玉县| 萝北县| 花垣县| 昂仁县| 海原县| 奉贤区| 潍坊市| 临沭县| 汉源县| 广汉市| 平乐县| 玉林市| 原阳县| 胶州市| 北票市| 阿拉善盟| 舟曲县| 翁源县| 乳山市| 苏尼特左旗| 冀州市| 镇康县| 仪征市| 岗巴县| 永和县| 宣汉县| 营口市| 黄石市|