【高併發】不廢話,言簡意賅介紹BlockingQueue

寫在前面

最近,有很多網友留言提問:在Java的併發編程中,有個BlockingQueue,它是個阻塞隊列,爲什麼要在併發編程裏使用BlockingQueue呢?好吧,今天,就臨時說一下BlockingQueue吧,不過今天說的不是很深刻,後面我們一塊兒從源頭上深刻剖析這個類。編程

BlockingQueue概述

阻塞隊列,是線程安全的。數組

被阻塞的狀況以下:緩存

(1)當隊列滿時,進行入隊列操做
(2)當隊列空時,進行出隊列操做安全

使用場景以下:微信

主要在生產者和消費者場景。併發

BlockingQueue的方法高併發

BlockingQueue 具備 4 組不一樣的方法用於插入、移除以及對隊列中的元素進行檢查。若是請求的操做不能獲得當即執行的話,每一個方法的表現也不一樣。這些方法以下:學習

拋出異常 特殊值 阻塞 超時
插入 add(e) offer(e) put(e) offer(e, time, unit)
移除 remove() poll() take() poll(time, unit)
檢查 element() peek() 不可用 不可用


四組不一樣的行爲方式解釋線程

  • 拋出異常

若是試圖的操做沒法當即執行,拋一個異常。對象

  • 特殊值

若是試圖的操做沒法當即執行,返回一個特定的值(經常是 true / false)。

  • 阻塞

若是試圖的操做沒法當即執行,該方法調用將會發生阻塞,直到可以執行。

  • 超時

若是試圖的操做沒法當即執行,該方法調用將會發生阻塞,直到可以執行,但等待時間不會超過給定值。返回一個特定值以告知該操做是否成功(典型的是 true / false)。

BlockingQueue的實現類

  • ArrayBlockingQueue:有界的阻塞隊列(容量有限,必須在初始化的時候指定容量大小,容量大小指定後就不能再變化),內部實現是一個數組,以FIFO的方式存儲數據,最新插入的對象是尾部,最新移除的對象是頭部。
  • DelayQueue:阻塞的是內部元素,DelayQueue中的元素必須實現一個接口——Delayed(存在於J.U.C下)。Delayed接口繼承了Comparable接口,這是由於Delayed接口中的元素須要進行排序,通常狀況下,都是按照Delayed接口中的元素過時時間的優先級進行排序。應用場景主要有:定時關閉鏈接、緩存對象、超時處理等。內部實現使用PriorityQueue和ReentrantLock。
  • LinkedBlockingQueue:大小配置是可選的,若是初始化時指定了大小,則是有邊界的;若是初始化時未指定大小,則是無邊界的(其實默認大小是Integer類型的最大值)。內部實現時一個鏈表,以FIFO的方式存儲數據,最新插入的對象是尾部,最新移除的對象是頭部。
  • PriorityBlockingQueue:帶優先級的阻塞隊列,無邊界,可是有排序規則,容許插入空對象(也就是null)。全部插入的對象必須實現Comparable接口,隊列優先級的排序規則就是按照對Comparable接口的實現來定義的。能夠從PriorityBlockingQueue中得到一個迭代器Iterator,但這個迭代器並不保證按照優先級的順序進行迭代。
  • SynchronousQueue:隊列內部僅容許容納一個元素,當一個線程插入一個元素後,就會被阻塞,除非這個元素被另外一個線程消費。所以,也稱SynchronousQueue爲同步隊列。SynchronousQueue是一個無界非緩存的隊列。準確的說,它不存儲元素,放入元素只有等待取走元素以後,才能再次放入元素。

寫在最後

若是以爲文章對你有點幫助,請微信搜索並關注「 冰河技術 」微信公衆號,跟冰河學習高併發編程技術。

最後,附上併發編程須要掌握的核心技能知識圖,祝你們在學習併發編程時,少走彎路。

sandahexin_20200322

相關文章
相關標籤/搜索