常用執行緒安全的佇列

2022-09-14 03:18:09 字數 1307 閱讀 6308

參考

執行緒安全佇列可以分為,阻塞執行緒安全佇列和非阻塞執行緒安全佇列

阻塞執行緒安全佇列常用為arrayblockingqueue、linkedblockingqueue

非阻塞執行緒安全佇列一般為concurrentlinkedqueue

將不需要序列化的屬性前新增關鍵字transient,序列化物件的時候,這個屬性就不會被序列化。

1、transient底層實現原理是什麼?

j**a的serialization提供了乙個非常棒的儲存物件狀態的機制,說白了serialization就是把物件的狀態儲存到硬碟上 去,等需要的時候就可以再把它讀出來使用。有些時候像銀行卡號這些欄位是不希望在網路上傳輸的,transient的作用就是把這個欄位的生命週期僅存於呼叫者的記憶體中而不會寫到磁碟裡持久化,意思是transient修飾的age欄位,他的生命週期僅僅在記憶體中,不會被寫到磁碟中。

2、被transient關鍵字修飾過得變數真的不能被序列化嘛?

實現了externalizable介面,哪乙個屬性被序列化使我們手動去指定的,即使是transient關鍵字修飾也不起作用。

靜態變數不管是不是transient關鍵字修飾,都不會被序列化

非阻塞方法,offer(e)、poll()公用同乙個reentrantlock,阻塞方法put(e)和take()採用reentrantlock的兩個condition佇列分別用於交替喚醒。

linkedblockingqueue中用了兩個reentrantlock,兩個reentrantlock分別對應乙個condition。

入隊操作其實操作的只有隊尾引用last,並且沒有牽涉到head。而出隊操作其實只針對head,和last沒有關係。那麼就是說入隊和出隊的操作完全不需要公用一把鎖,所以就設計了兩個鎖,這樣就實現了多個不同任務的執行緒入隊的同時可以進行出隊的操作,另一方面由於兩個操作所共同使用的count是atomicinteger型別的,所以完全不用考慮計數器遞增遞減的問題。

concurrentlinkedqueue是乙個無鎖的併發執行緒安全的佇列。對比鎖機制的實現,使用無鎖機制的難點在於要充分考慮執行緒間的協調。簡單的說就是多個執行緒對內部資料結構進行訪問時,如果其中乙個執行緒執行的中途因為一些原因出現故障,其他的執行緒能夠檢測並幫助完成剩下的操作。這就需要把對資料結構的操作過程精細的劃分成多個狀態或階段,考慮每個階段或狀態多執行緒訪問會出現的情況。

concurrentlinkedqueue有兩個volatile的執行緒共享變數:head,tail。要保證這個佇列的執行緒安全就是保證對這兩個node的引用的訪問(更新,檢視)的原子性和可見性,由於volatile本身能夠保證可見性,所以就是對其修改的原子性要被保證。通過cas保證執行緒安全,實現較為複雜。

執行緒安全的佇列 阻塞佇列

queue佇列 先進先出,兩個執行緒同時操作同乙個佇列,執行緒是不安全的 blockingqueue阻塞佇列 先進先出,執行緒是安全,阻塞佇列中維護了鎖,用於進出佇列。一般阻塞佇列用於生產者和消費者模式。arrayblockingqueue 1 基於陣列的阻塞佇列。2 維護的是定長陣列,初始化的時候...

執行緒安全的佇列寫法

首先,互斥量這種執行緒相關的內容是平台相關的,我假設你用的是windows平台開發。其次,說明一下我的開發環境,vs2008,控制台程式,空的工程。最後給你貼 分檔案來看。標頭檔案queuenode.h 你需要的節點資料可能不是整數,只要將typedef int queuedata這一句的int換成...

訊息佇列 執行緒安全

為什麼在互斥量的基礎上還需要加條件變數?需要注意的是 include int pthread cond wait pthread cond t cv,pthread mutex t mutex 返回值 函式成功返回0 任何其他返回值都表示錯誤 函式將解鎖mutex引數指向的互斥鎖,並使當前執行緒阻塞...