非阻塞隊列
ConcurrentLinkedQueue
ConcurrentLinkedQueue非阻塞無界隊列
ConcurrentLinkedQueue使用鏈表作為數(shù)據(jù)結(jié)構(gòu)示惊,它采用無鎖cas操作,可以任務(wù)是高并發(fā)環(huán)境下性能最好的隊列
ConcurrentLinkedQueue是非阻塞線程安全隊列,無界福贞,故不太適合做生產(chǎn)者消費者模式
阻塞隊列
BlockingQueue 阻塞隊列公共接口
重要方法
offer(anObject):表示如果可能的話, 將anObject加到BlockingQueue里,即如果BlockingQueue可以容納, 則返回true, 否則返回false.(本方法不阻塞當前執(zhí)行方法的線程)
offer(E o, long timeout, TimeUnit unit), 可以設(shè)定等待的時間况鸣,如果在指定的時間內(nèi)叉弦,還不能往隊列中加入BlockingQueue忙厌,則返回失敗
put(anObject): 把anObject加到BlockingQueue里, 如果BlockQueue沒有空間, 則調(diào)用此方法的線程被阻斷直到BlockingQueue里面有空間再繼續(xù)
poll(long timeout, TimeUnit unit):從BlockingQueue取出一個隊首的對象铃岔,如果在指定時間內(nèi)涉馁,隊列一旦有數(shù)據(jù)可取门岔,則立即返回隊列中的數(shù)據(jù)。否則知道時間超時還沒有數(shù)據(jù)可取烤送,返回失敗
take(): 取走BlockingQueue里排在首位的對象,若BlockingQueue為空,阻斷進入等待狀態(tài)直到BlockingQueue有新的數(shù)據(jù)被加入
drainTo():一次性從BlockingQueue獲取所有可用的數(shù)據(jù)對象(還可以指定獲取數(shù)據(jù)的個數(shù))寒随,通過該方法,可以提升獲取數(shù)據(jù)效率帮坚;不需要多次分批加鎖或釋放鎖
什么是無界隊列妻往?指的是沒有設(shè)置固定大小的隊列。這些隊列的特點是可以直接入列试和,直到溢出讯泣。當然現(xiàn)實幾乎不會有到這么大的容量(超過 Integer.MAX_VALUE),所以從使用者的體驗上阅悍,就相當于 “無界”好渠。比如沒有設(shè)定固定大小的 LinkedBlockingQueue
ArrayBlockingQueue 數(shù)組實現(xiàn)的有界阻塞隊列
在ArrayBlockingQueue內(nèi)部,維護了一個定長數(shù)組节视,以便緩存隊列中的數(shù)據(jù)對象拳锚,其內(nèi)部沒實現(xiàn)讀寫分離,也就意味著生產(chǎn)和消費不能完全并行寻行,長度是需要定義的霍掺,可以指定先進先出或者先進后出,也叫有界隊列,在很多場合非常適合使用
LinkedBlockingQueue:鏈表實現(xiàn)的可選阻塞隊列(指定容量有界抗楔,默認無界)
同ArrayBlockingQueue類似棋凳,其內(nèi)部也維持著一個數(shù)據(jù)緩沖隊列(該隊列由一個鏈表構(gòu)成),LinkedBlockingQueue之所以能夠高效的處理并發(fā)數(shù)據(jù)连躏,是因為其內(nèi)部實現(xiàn)采用分離鎖(讀寫分離兩個鎖)剩岳,從而實現(xiàn)生產(chǎn)者和消費者操作的完全并行運行
SynchronousQueue:不存儲元素的阻塞隊列
生產(chǎn)者產(chǎn)生的數(shù)據(jù)直接會被消費者獲取并消費
PriorityBlockingQueue 支持優(yōu)先級排序的無界阻塞隊列
優(yōu)先級的判斷通過構(gòu)造函數(shù)傳入的Compator對象來決定,也就是說傳入隊列的對象必須實現(xiàn)Comparable接口入热,在實現(xiàn)PriorityBlockingQueue時拍棕,內(nèi)部控制線程同步的鎖采用的是公平鎖,他也是一個無界的隊列
delayQueue:帶有延遲時間的Queue 優(yōu)先級隊列實現(xiàn)的無界阻塞隊列
其中的元素只有當其指定的延遲時間到了勺良,才能夠從隊列中獲取到該元素绰播。DelayQueue中的元素必須實現(xiàn)Delayed接口,DelayQueue是一個沒有大小限制的隊列尚困,應(yīng)用場景很多蠢箩,比如對緩存超時的數(shù)據(jù)進行移除、 任務(wù)超時處理事甜、空閑連接的關(guān)閉等等