Java 併發基礎知識 LinkedBlockingDeque 全面分析!

Mondo 科技 更新 2024-02-11

優質作者名單

J**A 併發基礎知識:LinkedBlockingDeque 完整分析! - 程式設計師古德linkedblockingdeque它提供了雙端佇列的執行緒安全實現,支援佇列兩端的高效插入和刪除操作,並具有可以很好地協調生產者和消費者之間速度差異的阻塞功能,其內部鍊表結構使得出色的併發效能,非常適合處理多執行緒之間的資料傳輸。

linkedblockingdeque實現乙個執行緒安全的雙端佇列(deque),它可以在兩端新增和刪除元素,並且它被阻塞,這意味著當隊列為空時,如果執行緒試圖從佇列中獲取乙個元素,則執行緒將被阻塞,直到佇列中有乙個元素需要刪除; 同樣,如果佇列已滿,則嘗試新增元素的執行緒將被阻止,直到佇列中有足夠的空間用於新增新元素。

舉乙個生活中的實際案例,比如在一家麵包店裡,麵包師負責生產麵包(生產者),顧客來店裡買麵包(消費者),麵包師做好麵包後,會放在展示架上供顧客選擇; 顧客從這個展示架上拿出他們想要的麵包,然後在這裡使用linkedblockingdeque來模擬此場景。 麵包師(生產者執行緒)將新鮮製作的麵包放在佇列的一端(向佇列中新增元素),而客戶(消費者執行緒)從佇列的另一端獲取麵包(從佇列中刪除元素):

阻塞特性:如果展示架上沒有麵包(佇列是空的),顧客將被阻止,直到麵包師製作新麵包並將其放在展示架上,同樣,如果展示架已滿(佇列已滿),麵包師將被阻止,直到顧客拿起一些麵包並為新麵包騰出空間。 雙端操作在這種情況下,雖然通常麵包師只將麵包放在一端,而顧客在另一端取麵包,但雙端佇列的靈活性意味著這種行為可以很容易地改變,例如,如果有特殊情況,麵包師可以從展示架上取回一些麵包(從佇列的另一端移除元素), 或者,客戶可以將他們的麵包訂單預先放在展示架上(在佇列的另一端新增元素)。linkedblockingdeque是乙個執行緒安全的雙端佇列,允許在佇列的兩端新增和刪除元素,它是阻塞的,通常用於解決以下問題:

執行緒安全:在多執行緒環境中,當多個執行緒需要訪問和修改共享資料時linkedblockingdeque它提供了一種執行緒安全的方式來儲存和檢索此資料,其內部同步機制可確保資料的一致性和完整性。 阻塞操作:當隊列為空時,使用執行緒呼叫take()在生產者執行緒將元素新增到佇列之前,方法將被阻止,並且當佇列已滿時,生產者執行緒再次呼叫put()在使用者執行緒從佇列中刪除元素之前,方法也會被阻止,這有助於防止執行緒不必要地空閒或浪費 CPU 資源。 容量限制linkedblockingdeque您可以在建立時指定最大容量,這會限制佇列中可以儲存的元素數,有助於防止記憶體溢位,並且當佇列達到其最大容量時,生產者執行緒將被阻止,直到佇列中有可用空間。 雙端操作:與平凡blockingqueue介面實現,linkedblockingdeque提供了雙端佇列的功能,允許在佇列的兩端新增和刪除元素,這為某些特定用例提供了更大的靈活性。 高效的併發效能:由於其內部使用鍊表資料結構linkedblockingdeque在處理大量併發操作時,通常具有良好的效能,適用於需要高吞吐、低延遲的生產者-消費者場景。 下面是乙個簡單的示例,演示了如何使用它linkedblockingdeque類,如下所示**:

import j**a.util.concurrent.blockingqueue; 

import j**a.util.concurrent.linkedblockingdeque;

public class linkedblockingdequeexample

catch (interruptedexception e)

啟動使用者執行緒以從佇列中刪除元素

thread consumer = new thread(()

catch (interruptedexception e)

啟動生產者和使用者執行緒

producer.start();

consumer.start();

等待兩個執行緒的執行完成

producer.join();

consumer.join();

system.out.println("producer and consumer threads h**e finished.");

在上面,建立了乙個linkedblockingdeque例項,並指定其最大容量為 5,然後建立乙個生產者執行緒和乙個消費者執行緒,生產者執行緒將迴圈 10 次,每次生成乙個字串,如果佇列已滿,則將其放入佇列put該方法將阻塞,直到佇列中有可用空間,並且使用者執行緒每次將迴圈 10 次,從佇列中獲取乙個元素並列印它(如果隊列為空)take該方法將阻塞,直到佇列中存在所需的元素。

由於生產者和消費者執行緒的速度可能不同,linkedblockingdeque作為阻塞佇列能夠協調這兩個執行緒之間的速度差異,確保它們可以協同工作,而不會因為隊列為空或已滿而導致任何一方停滯。

linkedblockingdeque實現blockingdeque介面,這是乙個執行緒安全的雙端佇列,如下所示:linkedblockingdeque類中一些主要方法的含義:

add(e e)將指定的元素插入到此雙端佇列表示的佇列中(即,位於此雙端佇列的尾部),如果立即可行且不違反容量限制,則在成功時返回true,如果當前沒有可用空間,則將其丟擲illegalstateexception這是queue介面。 offer(e e)將指定的元素插入到此雙端佇列表示的佇列中(即,位於此雙端佇列的尾部),如果立即可行且不違反容量限制,則在成功時返回true如果當前沒有可用空間,則返回false這是queue介面。 put(e e)throws interruptedException 將指定的元素插入到由此雙端佇列表示的佇列中(即在此雙端佇列的尾部),並在必要時等待空間可用,這是blockingqueue介面。 offer(e e, long timeout, timeunit unit)指定的元素入到由此雙端佇列表示的佇列中,如有必要,將等待指定的時間量以使空間變得可用,即blockingqueue介面。 remove()獲取並移除此雙端佇列表示的佇列的頭部,如果此雙端隊列為空,則引發該佇列nosuchelementexception這是queue介面。 poll()獲取並移除此雙端佇列表示的佇列的頭部,如果此雙端隊列為空,則返回null這是queue介面。 take()throws interruptedException 獲取並刪除由此雙端佇列表示的佇列的頭部,等待該元素變得可用,這是blockingqueue介面。 poll(long timeout, timeunit unit)獲取並移除由此雙端佇列表示的佇列的頭部,並等待該元素在指定的時間內可用,即blockingqueue介面。 peek()獲取但不刪除此雙端佇列表示的佇列頭,如果此雙端隊列為空,則返回null這是queue介面。 element()獲取但不刪除此雙端佇列表示的佇列頭,即queue介面。 push(e e)將元素推送到此雙端佇列(即此雙端佇列的頭部)表示的堆疊中,如果它立即可行且不違反容量限制,則成功返回true,如果當前沒有可用空間,則將其丟擲illegalstateexceptionpop()元素將從此雙端佇列表示的堆疊中彈出,如果此雙端隊列為空,則丟擲元素nosuchelementexceptionaddfirst(e e)addlast(e e)在此雙端佇列的開頭或結尾插入指定的元素。 offerfirst(e e)offerlast(e e)在此雙端佇列的開頭或結尾插入指定的元素,如果立即可行且不違反容量限制,則在成功時返回true如果當前沒有可用空間,則返回falseremovefirst()removelast()獲取並移除此雙端佇列的第乙個或最後乙個元素。 pollfirst()polllast()獲取並刪除此雙端佇列的第乙個或最後乙個元素,如果雙端隊列為空,則返回nullgetfirst()getlast()獲取但不刪除此雙端佇列的第乙個或最後乙個元素。 peekfirst()peeklast()獲取但不刪除此雙端佇列的第乙個或最後乙個元素,如果此雙端隊列為空,則返回null

J**A 併發基礎知識:LinkedBlockingDeque 完整分析! - 程式設計師古德linkedblockingdeque它結合了阻塞佇列和雙端佇列的特點,具有高效併發效能和靈活的兩端操作的優點,適合在生產者-消費者場景中使用,可以很好地處理多執行緒之間的資料共享和傳輸,缺點是如果在高併發下佇列大小設定不當, 可能會導致過多的執行緒阻塞,影響系統的整體效能,此外,由於它是基於鍊表的實現,其記憶體占用可能相對較高。

跟著我,每天學習網際網絡程式設計技術——程式設計師古德結束!

J**A 併發基礎知識:LinkedBlockingDeque 完整分析!

J**A 併發基礎:LinkedTransferQueue 綜合分析!

J**A 併發基礎知識:LinkedBlockingQueue 完整分析!

J**A 併發基礎知識:Deque 介面和 Queue 介面之間有什麼區別?

Spring Core Basics:Spring 中提供的基本工具類的全面總結!

相關問題答案

    Java 併發基礎知識 CyclicBarrier 分析!

    優質作者名單 J A 併發基礎 CyclicBarrier 的綜合分析!CyclicBarrier 的優勢在於實現了執行緒之間的相互等待和協作,保證了所有執行緒只有在到達預定的障礙點後才能繼續執行,它支援障礙的復用,非常適合多輪次任務同步,此外,CyclicBarrier 還允許在障礙點執行特定的操...

    Java 併發基礎知識 CountDownLatch 全面分析!

    優質作者名單 j a 併發基礎知識 CountDownLatch 完整分析!程式設計師古德countdownlatch優點是可以簡潔高效地協調多個執行緒的執行順序,保證只有一組執行緒完成後才會觸發其他執行緒的執行,適用於資源載入 任務初始化等場景。它提供了清晰的等待通知機制,易於理解和使用,是提高多...

    Java 併發基礎知識 Phaser 全面分析!

    優質作者名單 J A 併發基礎知識 移相器綜合分析!Programmer Goode Phaser 是 J a 中一款靈活的同步工具,它的優點是支援多階段任務拆分和同步,並且可以動態註冊和登出參與者,它提供了豐富的等待和推送機制,讓開發者可以更細粒度的方式控制線程的協調行為,實現複雜的並行任務處理,...

    Java 併發基礎知識 Deque 介面和佇列介面之間有什麼區別?

    優質作者名單 J A 併發基礎知識 Deque 介面和 Queue 介面之間有什麼區別?程式設計師古德deque 雙端佇列 和queue queues 是 J A 集合框架中處理元素排隊和排隊的兩個介面,但它們之間存在一些重要差異,如下所示 .佇列介面 queue該介面表示先進先出 FIFO 佇列,...

    Java 併發同步原理高階

    故事人物。老王 JVM Xiao Nan 執行緒.小女孩 執行緒。房間 物件。在房間的門上 防盜鎖 顯示器重量級鎖。房間上門 小楠書包 輕量鎖。在房間的門上 刻有小南的名字 偏置鎖 該物體是執行緒獨有的。批量重新寫入 一類偏置鎖撤銷達到 閾值 批量重新偏置。無法雕刻名稱 批量撤銷對此類物件的偏差鎖定...