1. 程式人生 > >【高併發】不廢話,言簡意賅介紹BlockingQueue

【高併發】不廢話,言簡意賅介紹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是一個無界非快取的佇列。準確的說,它不儲存元素,放入元素只有等待取走元素之後,才能再次放入元素。

寫在最後

如果覺得文章對你有點幫助,請微信搜尋並關注「 冰河技術 」微信公眾號,跟冰河學習高併發程式設計技術。

最後,附上併發程式設計需要掌握的核心技能知識圖,祝大家在學習併發程式設計時,少走彎路。

相關推薦

併發廢話言簡意賅介紹BlockingQueue

寫在前面 最近,有不少網友留言提問:在Java的併發程式設計中,有個BlockingQueue,它是個阻塞佇列,為何要在併發程式設計裡使用BlockingQueue呢?好吧,今天,就臨時說一下BlockingQueue吧,不過今天說的不是很深入,後面咱們一起從源頭上深入剖析這個類。 BlockingQue

併發併發秒殺系統架構解密是所有的秒殺都是秒殺!

前言 很多小夥伴反饋說,高併發專題學了那麼久,但是,在真正做專案時,仍然不知道如何下手處理高併發業務場景!甚至很多小夥伴仍然停留在只是簡單的提供介面(CRUD)階段,不知道學習的併發知識如何運用到實際專案中,就更別提如何構建高併發系統了! 究竟什麼樣的系統算是高併發系統?今天,我們就一起解密高併發業務場景

併發併發分散式鎖架構解密是所有的鎖都是分散式鎖!!

## 寫在前面 > 最近,很多小夥伴留言說,在學習高併發程式設計時,不太明白分散式鎖是用來解決什麼問題的,還有不少小夥伴甚至連分散式鎖是什麼都不太明白。明明在生產環境上使用了自己開發的分散式鎖,為什麼還會出現問題呢?同樣的程式,加上分散式鎖後,效能差了幾個數量級!這又是為什麼呢?今天,我們就來說說如何

併發秒殺系統架構解密是所有的秒殺都是秒殺(升級版)!!

## 寫在前面 > 很多小夥伴反饋說,高併發專題學了那麼久,但是,在真正做專案時,仍然不知道如何下手處理高併發業務場景!甚至很多小夥伴仍然停留在只是簡單的提供介面(CRUD)階段,不知道學習的併發知識如何運用到實際專案中,就更別提如何構建高併發系統了! 究竟什麼樣的系統算是高併發系統?今天,我們就一

併發學好併發程式設計關鍵是要理解這三個核心問題

寫在前面 寫【高併發專題】有一段時間了,一些讀者朋友留言說,併發程式設計很難,學習了很多的知識,但是在實際工作中卻無從下手。對於一個線上產生的併發問題,又不知產生這個問題的原因究竟是什麼。對於併發程式設計,感覺上似乎是掌握了,但是真正用起來卻不是那麼回事! 其實,造成這種現象的本質原因就是沒有透徹的理解併發程

併發面試官問我如何使用Nginx實現限流我如此回答輕鬆拿到了Offer!

## 寫在前面 > 最近,有不少讀者說看了我的文章後,學到了很多知識,其實我本人聽到後是非常開心的,自己寫的東西能夠為大家帶來幫助,確實是一件值得高興的事情。最近,也有不少小夥伴,看了我的文章後,順利拿到了大廠Offer,也有不少小夥伴一直在刷我的文章,提升自己的內功,最終成為自己公司的核心業務開發人

併發Redis如何助力併發秒殺系統看完這篇我徹底懂了!!

## 寫在前面 > 之前,我們在《[【高併發】高併發秒殺系統架構解密,不是所有的秒殺都是秒殺!](https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&mid=2247484357&idx=1&sn=23e6e38143704db0

併發面試官:Java中提供了synchronized為什麼還要提供Lock呢?

## 寫在前面 > 在Java中提供了synchronized關鍵字來保證只有一個執行緒能夠訪問同步程式碼塊。既然已經提供了synchronized關鍵字,那為何在Java的SDK包中,還會提供Lock介面呢?這是不是重複造輪子,多此一舉呢?今天,我們就一起來探討下這個問題。 ## 再造輪子? 既

併發壓力測試 java.io.IOException: Too many open files解決方案

 對作業系統做相關的設定,增加最大檔案控制代碼數量。Linux在Linux核心2.4.x中需要修改原始碼,然後重新編譯核心才生效。編輯Linux核心原始碼中的 include/linux/fs.h檔案,將 NR_FILE 由8192改為65536,將NR_RESERVED_FILES 由10 改為 128。編

Amap/Google-開發無人機航跡規劃演示

ps:又到了週五,才有時間來寫點部落格記錄下,這篇文章的所描述的內容是我2017年後 做的一個功能,也是我們的產品經理結合 航跡規劃 以及我們所提供的 能做到的一些地圖開發結合,做的一個自創性的 開發吧。其實開始做的時候挺不自信的,因為第一,地圖sdk 並不是非常瞭解,再說

併發併發環境下詭異的加鎖問題(你加的鎖未必安全)

宣告 特此宣告:文中有關支付寶賬戶的說明,只是用來舉例,實際支付寶賬戶要比文中描述的複雜的多。也與文中描述的完全不同。 前言 很多網友留言說:在編寫多執行緒併發程式時,我明明對共享資源加鎖了啊?為什麼還是出問題呢?問題到底出在哪裡呢?其實,我想說的是:你的加鎖姿勢正確嗎?你真的會使用鎖嗎?錯誤的加鎖方式不但

併發什麼是ForkJoin?看這一篇就夠了!

寫在前面 在JDK中,提供了這樣一種功能:它能夠將複雜的邏輯拆分成一個個簡單的邏輯來並行執行,待每個並行執行的邏輯執行完成後,再將各個結果進行彙總,得出最終的結果資料。有點像Hadoop中的MapReduce。 ForkJoin是由JDK1.7之後提供的多執行緒併發處理框架。ForkJoin框架的基本思想是

併發優化加鎖方式時竟然死鎖了!!

寫在前面 今天,在優化程式的加鎖方式時,竟然出現了死鎖!!到底是為什麼呢?!經過仔細的分析之後,終於找到了原因。 為何需要優化加鎖方式? 在《【高併發】高併發環境下詭異的加鎖問題(你加的鎖未必安全)》一文中,我們在轉賬類TansferAccount中使用TansferAccount.class物件對程式加

併發你知道嗎?大家都在使用Redisson實現分散式鎖了!!

寫在前面 忘記之前在哪個群裡有朋友在問:有出分散式鎖的文章嗎~@冰河?我的回答是:這週會有,也是【高併發】專題的。想了想,還是先發一個如何使用Redisson實現分散式鎖的文章吧?為啥?因為使用Redisson實現分散式鎖簡單啊!Redisson框架是基於Redis實現的分散式鎖,非常強大,只需要拿來使用就

併發為何併發系統中都要使用訊息佇列?這次徹底懂了!

寫在前面 很多高併發系統中都會使用到訊息佇列中介軟體,那麼,問題來了,為什麼在高併發系統中都會使用到訊息佇列中介軟體呢?立志成為資深架構師的你思考過這個問題嗎? 本文集結了眾多技術大牛的程式設計思想,由冰河匯聚並整理而成,在此,感謝那些在技術發展道理上默默付出的前輩們! 場景分析 現在假設這樣一個場景,使

併發併發環境下該如何構建應用級快取?

寫在前面 隨著我們的系統負載越來越高,系統的效能就會有所下降,此時,我們可以很自然地想到使用快取來解決資料讀寫效能低下的問題。但是,立志成為資深架構師的你,是否能夠在高併發環境下合理並且高效的構建應用級快取呢? 快取命中率 快取命中率是從快取中讀取資料的次數與總讀取次數的比率,命中率越高越好。快取命中率=

併發併發環境下如何防止Tomcat記憶體溢位?看完我懂了!!

寫在前面 隨著系統併發量越來越高,Tomcat所佔用的記憶體就會越來越大,如果對Tomcat的記憶體管理不當,則可能會引發Tomcat記憶體溢位的問題,那麼,如何防止Tomcat記憶體溢位呢?我們今天就來一起探討下這個問題。 防止Tomcat記憶體溢位可以總結為兩個方案:一個是設定Tomcat啟動的初始記

併發如何設計一個支撐併發大流量的系統?這次我將設計思路分享給大家!

## 寫在前面 > 最近不少小夥伴們都在問我:高併發專題我學了不少文章了,但是如何設計一個高併發的系統我還是一臉懵逼!這個問題怎麼解決呢?其實,相信不只是問我的這些小夥伴有這個困惑,就連工作(入坑)了好幾年的開發人員也都有這樣的困惑:我學習了很多的高併發課程,也看了不少的高大上的文章,可就是不知道怎麼

併發併發環境下構建快取服務需要注意哪些問題?我和阿里P9聊了很久!

## 寫在前面 > 週末,跟阿里的一個朋友(去年晉升為P9了)聊了很久,聊的內容幾乎全是技術,當然了,兩個技術男聊得最多的話題當然就是技術了。從基礎到架構,從演算法到AI,無所不談。中間又穿插著不少天馬行空的想象,雖然現在看起來不太實際,但是隨著技術的進步,相信五年、十年之後都會實現的。 > &

併發億級流量場景下如何為HTTP介面限流?看完我懂了!!

## 寫在前面 > 在網際網路應用中,高併發系統會面臨一個重大的挑戰,那就是大量流高併發訪問,比如:天貓的雙十一、京東618、秒殺、搶購促銷等,這些都是典型的大流量高併發場景。關於秒殺,小夥伴們可以參見我的另一篇文章《[【高併發】高併發秒殺系統架構解密,不是所有的秒殺都是秒殺!](https://mp