java併發編程學習之阻塞隊列

BlockingQueue

BlockingQueue是線程安全的存取隊列,繼承了Queue。node

使用場景

消費者生產者模式。數組

  • 生產者,一直會往隊列裏扔數據,直到隊列滿了,開始阻塞,等待消費者取數據。
  • 消費者,一直會從隊列裏取數據,直到隊列空了,開始阻塞,等待生產者扔數據。

接口

clipboard.png

插入方法

  • 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相反,數組空了,請求放入隊列,等待隊列有內容。
clipboard.png安全

LinkedBlockingQueue

先進先出,初始化沒有給鏈表帶下,默認爲Integer.MAX_VALUE,有兩個鎖。數據結構

LinkedBlockingQueue與ArrayBlockingQueue

  • 鏈表是2個鎖,讀寫各一個,數組的是1個鎖
  • 鏈表操做時須要封裝成node,產生大量的node,GC耗時,數組直接操做,性能更高
  • 鏈表的生產者的速度大於消費者時,可能內存溢出

PriorityBlockingQueue

能夠直接經過Comparator或者Collection的Comparator進行排序,一個鎖。性能

DelayQueue

DelayQueue中的對象必須實現Delayed接口,延時取元素。
使用場景:spa

  1. 訂單到期未付款,取消訂單
  2. 刪除過時的緩存

SynchronousQueue

由於不存儲數據,因此每一次put,都要等待一個take。線程

LinkedTransferQueue

先進先出,若是消費者在等待接收元素,transfer方法把元素直接給消費者,若是沒有,則放對隊列的尾節點,並等到消費結束後返回。tryTransfer不管消費者是否消費,都直接返回。對象

LinkedBlockingDeque

頭部和尾部,均可以添加或移除元素。工做密取,就是用這個blog

相關文章
相關標籤/搜索