多執行緒讀寫優化(雙buff記憶體交換代替有鎖設計)
例子(場景)
目前有執行緒ThreadA和ThreadB,一個佇列Queue。ThreadA會對Queue進行入隊操作,而ThreadB會對Queue進行出隊操作。如下圖:
一般情況下,我們都會直接給Queue上鎖,這樣就能保證多執行緒同時對Queue進行操作時不會有問題。
直接加上鎖可以很容易就解決這個問題,但是也會帶來其他的問題:入隊操作一般幾乎不耗時,而出隊操作往往帶有其他一系列邏輯操作,所以會比較耗時。因此ThreadA本來做完一系列入隊操作可能只要3ms,但是由於等待ThreadB的鎖的釋放,可能多等待了200ms。如下圖:
在這種情況下,如果ThreadA在入隊操作還有其他邏輯,那麼後面的邏輯會被延後200ms執行,這是完全沒有必要的,因此便可以通過以下方式優化。
優化
直接使用兩個Queue物件,一個只給ThreadA用來入隊,一個只給ThreadB用來出隊,這樣入隊和出隊操作就可以分離,不用去爭搶鎖。
達到一定觸發條件的時候兩個Queue的記憶體就進行交換,原來入隊的Queue變為出隊的Queue,出隊的Queue變成入隊的Queue。這個觸發條件可以由ThreadA來控制,在ThreadA認為不需要繼續入隊並且ThreadB的佇列為空的時候,兩個Queue可以進行交換。如下圖:
這樣之後,在時間上的表現就變為下圖。對於ThreadA來講,一次將幾乎不耗時的入隊操作做完,後面如果有其他邏輯可以不會被耽誤。而對ThreadB來講,本來執行的操作可能就比較耗時,等待ThreadA的入隊操作時間也非常短,所以影響不大。
補充
可能讀者不太理解為什麼出隊操作會那麼耗時。因為上面是假設的出隊與後續邏輯操作連在一起的情況。
那麼是否意味著出隊之後直接釋放鎖,這種情況就不適用了呢?不是的。
入隊操作需要佔用一次鎖和釋放一次鎖,出隊操作同樣是的。如果每出隊一次就需要佔用和釋放一次鎖,那麼如果有100個就需要佔用和釋放鎖一百次,這是在數量較多的情況下是非常消耗資源的了。
因此把鎖給去掉在這種情況下也是有相當的優化價值。
相關文章
- Java多執行緒程式設計—鎖優化Java執行緒程式設計優化
- 多執行緒與併發----讀寫鎖執行緒
- 使用執行緒池優化多執行緒程式設計執行緒優化程式設計
- 【C/C++多執行緒程式設計之九】pthread讀寫鎖C++執行緒程式設計thread
- Java多執行緒記憶體模型Java執行緒記憶體模型
- 多執行緒筆記---鎖(Synchronized)的優化和種類執行緒筆記synchronized優化
- 1、多執行緒同步——CPU、core核、執行緒、記憶體執行緒記憶體
- Java多執行緒之記憶體模型Java執行緒記憶體模型
- 多執行緒系列(十一) -淺析併發讀寫鎖StampedLock執行緒
- 多執行緒併發程式設計“鎖”事執行緒程式設計
- 併發程式設計之volatile與JMM多執行緒記憶體模型程式設計執行緒記憶體模型
- GCD 多執行緒安全 單寫多讀GC執行緒
- python多執行緒程式設計3: 使用互斥鎖同步執行緒Python執行緒程式設計
- 多執行緒_鎖執行緒
- [短文速讀 -5] 多執行緒程式設計引子:程式、執行緒、執行緒安全執行緒程式設計
- 多執行緒之Java記憶體模型(JMM)(一)執行緒Java記憶體模型
- LINUX多執行緒讀寫同一個檔案 加鎖Linux執行緒
- VC++多執行緒下記憶體操作的最佳化 (轉)C++執行緒記憶體
- Java多執行緒(2)執行緒鎖Java執行緒
- iOS底層原理 多執行緒之安全鎖以及常用的讀寫鎖 --(11)iOS執行緒
- openharmony 多執行緒的方式有哪些?兩個worker執行緒資料如何通訊、記憶體如何共享、與Java多執行緒有什麼區別?執行緒記憶體Java
- Java 執行緒記憶體模型Java執行緒記憶體模型
- Linux執行緒之讀寫鎖小結Linux執行緒
- 為什麼多執行緒讀寫shared_ptr需要加鎖執行緒
- Java 共享資料讀寫(多執行緒)Java執行緒
- 什麼是多執行緒?Python多執行緒有什麼優勢?執行緒Python
- 多執行緒程式設計執行緒程式設計
- java優化程式設計-記憶體管理Java優化程式設計記憶體
- python多執行緒程式設計4: 死鎖和可重入鎖Python執行緒程式設計
- Java多執行緒13:讀寫鎖和兩種同步方式的對比Java執行緒
- iOS多執行緒安全-13種執行緒鎖?iOS執行緒
- 多執行緒(2)-執行緒同步互斥鎖Mutex執行緒Mutex
- javascript執行緒及與執行緒有關的效能優化JavaScript執行緒優化
- java多執行緒–同步鎖Java執行緒
- Java多執行緒-無鎖Java執行緒
- 理解JVM(六):執行緒安全和鎖優化JVM執行緒優化
- 程式設計思想之多執行緒與多程式(2):執行緒優先順序與執行緒安全程式設計執行緒
- .NET多執行緒程式設計(1):多工和多執行緒 (轉)執行緒程式設計