【面試普通人VS高手系列】什麼叫做阻塞隊列的有界和無界
- 2022 年 4 月 16 日
- 筆記
- JAVA, 面試普通人vs高手系列, 面試題
昨天一個3年Java經驗的小夥伴私信我,他說現在面試怎麼這麼難啊!
我只是面試一個業務開發,他們竟然問我: 什麼叫阻塞隊列的有界和無界。現在面試也太卷了吧!
如果你也遇到過類似問題,那我們來看看普通人和高手的回答吧!
普通人
有界隊列就是說隊列中的元素個數是有限制的,而無界對接表示隊列中的元素個數沒有限制! 嗯!!!
高手
-
阻塞隊列,是一種特殊的隊列,它在普通隊列的基礎上提供了兩個附加功能
- 當隊列為空的時候,獲取隊列中元素的消費者執行緒會被阻塞,同時喚醒生產者執行緒。
- 當隊列滿了的時候,向隊列中添加元素的生產者執行緒被阻塞,同時喚醒消費者執行緒。
-
其中,阻塞隊列中能夠容納的元素個數,通常情況下是有界的,比如我們實例化一個
ArrayBlockingList
,可以在構造方法中傳入一個整形的數字,表示這個基於數組的阻塞隊列中能夠容納的元素個數。這種就是有界隊列。 -
而無界隊列,就是沒有設置固定大小的隊列,不過它並不是像我們理解的那種元素沒有任何限制,而是它的元素存儲量很大,像LinkedBlockingQueue,它的默認隊列長度是Integer.Max_Value,所以我們感知不到它的長度限制。
-
無界隊列存在比較大的潛在風險,如果在並發量較大的情況下,執行緒池中可以幾乎無限制的添加任務,容易導致記憶體溢出的問題!
以上就是我對這個問題的理解!
總結
阻塞隊列在生產者消費者模型的場景中使用頻率比較高,比較典型的就是在執行緒池中,通過阻塞隊列來實現執行緒任務的生產和消費功能。
基於阻塞隊列實現的生產者消費者模型比較適合用在非同步化性能提升的場景,以及做並發流量緩衝類的場景中!
在很多開源中間件中都可以看到這種模型的使用,比如在Zookeeper源碼中就大量用到了阻塞隊列實現的生產者消費者模型。
OK,本期的普通人VS高手面試系列就到這裡結束了,喜歡的朋友記得點贊收藏,需要面試資料或者面試問題諮詢可以私信或評論區下方留言。
我是Mic,一個工作了14年的Java程式設計師,咱們下期再見。