阻塞佇列之SynchronousQueue

2021-06-19 09:22:24 字數 1004 閱讀 7015

synchronousqueue是一種無緩衝的等待佇列,類似於無中介的直接交易,有點像原始社會中的生產者和消費者,生產者拿著產品去集市銷售給產品的最終消費者,而消費者必須親自去集市找到所要商品的直接生產者,如果一方沒有找到合適的目標,那麼對不起,大家都在集市等待。相對於有緩衝的blockingqueue來說,少了乙個中間經銷商的環節(緩衝區),如果有經銷商,生產者直接把產品批發給經銷商,而無需在意經銷商最終會將這些產品賣給那些消費者,由於經銷商可以庫存一部分商品,因此相對於直接交易模式,總體來說採用中間經銷商的模式會吞吐量高一些(可以批量買賣);但另一方面,又因為經銷商的引入,使得產品從生產者到消費者中間增加了額外的交易環節,單個產品的及時響應效能可能會降低。

宣告乙個synchronousqueue有兩種不同的方式,它們之間有著不太一樣的行為。公平模式和非公平模式的區別:

a、如果採用公平模式:synchronousqueue會採用公平鎖,並配合乙個fifo佇列來阻塞多餘的生產者和消費者,從而體系整體的公平策略;

b、但如果是非公平模式(synchronousqueue預設):synchronousqueue採用非公平鎖,同時配合乙個lifo佇列來管理多餘的生產者和消費者,而後一種模式,如果生產者和消費者的處理速度有差距,則很容易出現飢渴的情況,即可能有某些生產者或者是消費者的資料永遠都得不到處理。

synchronousqueue內部並沒有資料快取空間。不能呼叫peek()方法來看佇列中是否有資料元素,因為資料元素只有當你試著取走的時候才可能存在,不取走而只想**一下是不行的。遍歷這個佇列的操作也是不允許的。每個put必須等待乙個take,反之亦然。同步佇列沒有任何內部容量,甚至連乙個佇列的容量都沒有。它是執行緒安全的,是阻塞的。不允許使用null元素。佇列頭元素是第乙個排隊要插入資料的執行緒,而不是要交換的資料。資料是在配對的生產者和消費者執行緒之間直接傳遞的,並不會將資料緩衝資料到佇列中。可以這樣來理解:生產者和消費者互相等待對方,握手,然後一起離開。

它非常適合於傳遞性設計,在這種設計中,在乙個執行緒中執行的物件要將某些資訊、事件或任務傳遞給在另乙個執行緒中執行的物件,它就必須與該物件同步。

阻塞佇列之ArrayBlockingQueue

當使用阻塞佇列的時候,它可能會對當前執行緒產生阻塞,比如乙個執行緒從乙個空的阻塞佇列中取元素,此時執行緒會被阻塞直到阻塞佇列中有了元素。當佇列中有元素後,被阻塞的執行緒會自動被喚醒。arrayblockingqueue是使用陣列作為底層儲存的。陣列儲存 private final e items 隊...

阻塞佇列之DelayQueue

特點 1 內部佇列基於priorityqueue,其要求放入的元素不能為null 2 放置在內的物件,只有滿足條件 到期 且 排在佇列出口的 才能取出 3 放置在內的物件必須實現delayed介面,該介面有個getdelay方法,用於判斷是否到達執行時間 示例 delayqueue 可以延時取出的佇...

等待佇列 阻塞非阻塞

阻塞 裝置驅動不阻塞,使用者想獲取裝置資源只能不停的查詢,這無謂的消耗cpu資源。而阻塞訪問,不能獲取資源的程序將進入休眠,它將cpu資源 禮讓 給其他程序 喚醒程序的地方最大可能發生在中斷裡面,因為硬體資源獲得的同時往往伴隨著乙個中斷 定義頭 wait queue head t queue 初始化...