【面試普通人VS高手系列】什麼叫做阻塞佇列的有界和無界

跟著Mic學架構發表於2022-04-16

昨天一個3年Java經驗的小夥伴私信我,他說現在面試怎麼這麼難啊!
我只是面試一個業務開發,他們竟然問我: 什麼叫阻塞佇列的有界和無界。現在面試也太捲了吧!
如果你也遇到過類似問題,那我們來看看普通人和高手的回答吧!

普通人

有界佇列就是說佇列中的元素個數是有限制的,而無界對接表示佇列中的元素個數沒有限制! 嗯!!!

高手

  1. 阻塞佇列,是一種特殊的佇列,它在普通佇列的基礎上提供了兩個附加功能 image-20220313201420205

    1. 當佇列為空的時候,獲取佇列中元素的消費者執行緒會被阻塞,同時喚醒生產者執行緒。
    2. 當佇列滿了的時候,向佇列中新增元素的生產者執行緒被阻塞,同時喚醒消費者執行緒。
  2. 其中,阻塞佇列中能夠容納的元素個數,通常情況下是有界的,比如我們例項化一個ArrayBlockingList,可以在構造方法中傳入一個整形的數字,表示這個基於陣列的阻塞佇列中能夠容納的元素個數。這種就是有界佇列。

  3. 而無界佇列,就是沒有設定固定大小的佇列,不過它並不是像我們理解的那種元素沒有任何限制,而是它的元素儲存量很大,像LinkedBlockingQueue,它的預設佇列長度是Integer.Max_Value,所以我們感知不到它的長度限制。

  4. 無界佇列存在比較大的潛在風險,如果在併發量較大的情況下,執行緒池中可以幾乎無限制的新增任務,容易導致記憶體溢位的問題!

以上就是我對這個問題的理解!

總結

阻塞佇列在生產者消費者模型的場景中使用頻率比較高,比較典型的就是線上程池中,通過阻塞佇列來實現執行緒任務的生產和消費功能。

基於阻塞佇列實現的生產者消費者模型比較適合用在非同步化效能提升的場景,以及做併發流量緩衝類的場景中!

在很多開源中介軟體中都可以看到這種模型的使用,比如在Zookeeper原始碼中就大量用到了阻塞佇列實現的生產者消費者模型。

OK,本期的普通人VS高手面試系列就到這裡結束了,喜歡的朋友記得點贊收藏,需要面試資料或者面試問題諮詢可以私信或評論區下方留言。

我是Mic,一個工作了14年的Java程式設計師,我們們下期再見。

相關文章