Java并發(fā)工具包——BlockingQueue(一)
這期繼續(xù)Java并發(fā)包的介紹绷蹲,之前介紹了一些簡(jiǎn)單的并發(fā)工具拔妥,這一期說(shuō)一個(gè)相對(duì)復(fù)雜的工具(阻塞隊(duì)列)薪者。
簡(jiǎn)介
阻塞隊(duì)列很容易理解斯棒,就是在特殊的情況下處在阻塞狀態(tài)。
- 隊(duì)列處于滿的狀態(tài)劳坑,阻塞入隊(duì)列的操作
- 隊(duì)列處于空的狀態(tài)毕谴,阻塞出隊(duì)列的操作
- | Throws Exception | Special Value | Blocks | Times Out |
---|---|---|---|---|
insert | add(o) | offer(o) | put(o) | offer(o, timeout, timeunit) |
remove | remove(o) | poll() | take() | poll(timeout, timeunit) |
examine | element() | peek() |
- 拋異常:阻塞隊(duì)列滿/空的時(shí)候,入隊(duì)add出隊(duì)remove操作都會(huì)觸發(fā)異常
- 特殊值:入隊(duì)操作——true or false距芬,出隊(duì)操作——obj or null
- 常阻塞:阻塞隊(duì)列滿/空的時(shí)候涝开,入隊(duì)put出隊(duì)take操作都會(huì)一直阻塞
- 超時(shí):阻塞隊(duì)列滿/空的時(shí)候,入隊(duì)出隊(duì)操作一直阻塞到超時(shí)的設(shè)定時(shí)間
由于BlockingQueue的實(shí)現(xiàn)很多框仔,這期就說(shuō)一個(gè)比較簡(jiǎn)單的數(shù)組實(shí)現(xiàn)的有界阻塞隊(duì)列——ArrayBlockingQueue舀武。
應(yīng)用場(chǎng)景
ArrayBlockingQueue是由數(shù)組實(shí)現(xiàn)的有界阻塞隊(duì)列。在讀寫(xiě)操作上都需要鎖住整個(gè)容器离斩,所以性能上一般银舱,常用于實(shí)現(xiàn)“生產(chǎn)者消費(fèi)者”模式,秒殺場(chǎng)景可以起到服務(wù)端流量削峰的作用跛梗,減輕服務(wù)器瞬時(shí)壓力寻馏。
實(shí)例
生產(chǎn)者消費(fèi)者
輸出
原理
ArrayBlockingQueue作為一個(gè)BlockingQueue的實(shí)現(xiàn)類(lèi),通過(guò)ReentrantLock實(shí)現(xiàn)put和offer兩個(gè)方法的阻塞功能
拋出異常的方法實(shí)現(xiàn)
總結(jié)
ArrayBlockingQueue實(shí)現(xiàn)BlockingQueue中規(guī)中矩核偿,適合于各種普通的需要用到隊(duì)列的場(chǎng)景诚欠,但是對(duì)于性能要求較高,或者有優(yōu)先級(jí)功能的話就沒(méi)有辦法很好的實(shí)現(xiàn)了。