BlockingQueue
BlockingQueue是線程安全的存取隊列,繼承了Queue。node
使用場景
消費者生產者模式。數組
- 生產者,一直會往隊列裏扔數據,直到隊列滿了,開始阻塞,等待消費者取數據。
- 消費者,一直會從隊列裏取數據,直到隊列空了,開始阻塞,等待生產者扔數據。
接口
插入方法
- add:阻塞隊列滿了,拋出IllegalStateException異常。成功返回true。
- offer:插入成功,返回true,插入失敗,返回false。
- put:阻塞隊列滿了,就等到,可被中斷,拋出InterruptedException異常
移除方法
- remove:成功返回true,爲空拋出NoSuchElementException異常
- poll:若是隊列不爲空,移除並返回頭結點,若是隊列爲空,返回null
- take:若是隊列不爲空,移除並返回頭結點,若是隊列爲空,則等待,可被中斷,拋出InterruptedException異常
檢查方法:
- element:若是隊列不爲空,返回頭結點但不刪除,若是隊列爲空,拋出NoSuchElementException異常。
- peek:若是隊列不爲空,返回頭結點但不刪除,若是隊列爲空,返回null
子類
- ArrayBlockingQueue:一個由數組結構組成的有界阻塞隊列。
- LinkedBlockingQueue:一個由鏈表結構組成的有界阻塞隊列。
- PriorityBlockingQueue:一個支持優先級排序的無界阻塞隊列。
- DelayQueue:一個使用優先級排序實現的無界阻塞隊列。
- SynchronousQueue:一個不存儲元素的阻塞隊列。
- LinkedTransferQueue:一個由鏈表結構組成的無界阻塞隊列。
- LinkedBlockingDeque:一個由鏈表結構組成的雙向阻塞隊列。
ArrayBlockingQueue
先進先出,初始化必須給數組大小,只有一個鎖。緩存
ArrayBlockingQueue數據結構
- Object[] items:存放元素的數組
- int takeIndex:下一個讀操做的位置
- int putIndex:下一個寫操做的位置
- int count:數組中元素的數量
- ReentrantLock lock:同步器
- Condition notEmpty:數組空了,讀等待。寫的時候,喚醒
- Condition notFull:數組滿了,寫等待。讀的時候,喚醒
ArrayBlockingQueue原理
put先放入數組,滿了請求放入Condition等待數組空。take相反,數組空了,請求放入隊列,等待隊列有內容。
安全
LinkedBlockingQueue
先進先出,初始化沒有給鏈表帶下,默認爲Integer.MAX_VALUE,有兩個鎖。數據結構
LinkedBlockingQueue與ArrayBlockingQueue
- 鏈表是2個鎖,讀寫各一個,數組的是1個鎖
- 鏈表操做時須要封裝成node,產生大量的node,GC耗時,數組直接操做,性能更高
- 鏈表的生產者的速度大於消費者時,可能內存溢出
PriorityBlockingQueue
能夠直接經過Comparator或者Collection的Comparator進行排序,一個鎖。性能
DelayQueue
DelayQueue中的對象必須實現Delayed接口,延時取元素。
使用場景:spa
- 訂單到期未付款,取消訂單
- 刪除過時的緩存
SynchronousQueue
由於不存儲數據,因此每一次put,都要等待一個take。線程
LinkedTransferQueue
先進先出,若是消費者在等待接收元素,transfer方法把元素直接給消費者,若是沒有,則放對隊列的尾節點,並等到消費結束後返回。tryTransfer不管消費者是否消費,都直接返回。對象
LinkedBlockingDeque
頭部和尾部,均可以添加或移除元素。工做密取,就是用這個blog