Java Concurrent - BlockingQueue 實現(xiàn)

BlockingQueue,用JDK文檔中的原話,是用來解決類似生產(chǎn)者消費者問題的。

當一個Queue為空,則所有消費者被block;當一個Queue中元素已滿,則所有生產(chǎn)者被block。生產(chǎn)者生產(chǎn)了之后,要notify所有消費者,queue中元素已不為空。相對應(yīng)的,消費者消費了元素之后,要notify所有生產(chǎn)者,queue元素已不滿。

在Java中,BlockingQueue是一個繼承了Queue的接口,其實現(xiàn)有:ArrayBlockingQueue, DelayQueue, LinkedBlockingQueue, PriorityBlockingQueue以及SynchronousQueue.

ArrayBlockingQueue:

底層數(shù)據(jù)結(jié)構(gòu)是一個Object數(shù)組,同時有一個takeIndex,一個putIndex來表示獲取操作和放操作的指針,一個count變量來記錄Queue里的元素

對于并發(fā)控制,用一個ReentrantLock作為鎖,兩個Condition作為提示隊列滿或空的信號量

put函數(shù)作為類似生產(chǎn)者的函數(shù)。具體的實現(xiàn)就是經(jīng)典的生產(chǎn)者實現(xiàn)了。當隊列為滿的時候,信號量一直等待。當插入成功后,notify所有的正在等待的消費者。具體代碼如下:


嘗試插入,如果滿了就一直等待


插入,并且通知消費者,隊列不為空

take函數(shù)作為類似消費者的函數(shù)。同理也是經(jīng)典的生產(chǎn)者實現(xiàn)。

當隊列為空的時候,信號量一直等待。當消費成功后,notify所有的正在等待的生產(chǎn)者。具體代碼如下:


嘗試消費,如果隊列為空則一直等待


消費,并且通知消費者,此時隊列不滿


LinkedBlockingQueue

LinkedBlockingQueue,顧名思義,是底層用Linkedlist來實現(xiàn)的BlockingQueue


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容