多執行緒讀寫優化(雙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執行緒程式設計優化
- 多執行緒與併發----讀寫鎖執行緒
- Java多執行緒記憶體模型Java執行緒記憶體模型
- 多執行緒筆記---鎖(Synchronized)的優化和種類執行緒筆記synchronized優化
- 1、多執行緒同步——CPU、core核、執行緒、記憶體執行緒記憶體
- Java多執行緒之記憶體模型Java執行緒記憶體模型
- 併發程式設計之volatile與JMM多執行緒記憶體模型程式設計執行緒記憶體模型
- 多執行緒併發程式設計“鎖”事執行緒程式設計
- 多執行緒系列(十一) -淺析併發讀寫鎖StampedLock執行緒
- [短文速讀 -5] 多執行緒程式設計引子:程式、執行緒、執行緒安全執行緒程式設計
- 多執行緒之Java記憶體模型(JMM)(一)執行緒Java記憶體模型
- 多執行緒_鎖執行緒
- Linux執行緒之讀寫鎖小結Linux執行緒
- Java多執行緒(2)執行緒鎖Java執行緒
- iOS底層原理 多執行緒之安全鎖以及常用的讀寫鎖 --(11)iOS執行緒
- Java 執行緒記憶體模型Java執行緒記憶體模型
- openharmony 多執行緒的方式有哪些?兩個worker執行緒資料如何通訊、記憶體如何共享、與Java多執行緒有什麼區別?執行緒記憶體Java
- 什麼是多執行緒?Python多執行緒有什麼優勢?執行緒Python
- 多執行緒(2)-執行緒同步互斥鎖Mutex執行緒Mutex
- iOS多執行緒安全-13種執行緒鎖?iOS執行緒
- 理解JVM(六):執行緒安全和鎖優化JVM執行緒優化
- javascript執行緒及與執行緒有關的效能優化JavaScript執行緒優化
- Java多執行緒程式設計筆記9:ReentrantReadWriteLockJava執行緒程式設計筆記
- python 多執行緒程式設計Python執行緒程式設計
- JavaScript多執行緒程式設計JavaScript執行緒程式設計
- Python多執行緒程式設計Python執行緒程式設計
- 深入理解Java的堆記憶體和執行緒記憶體Java記憶體執行緒
- C++11多執行緒程式設計(二)——互斥鎖mutex用法C++執行緒程式設計Mutex
- 多執行緒程式設計進階——Java類庫中的鎖執行緒程式設計Java
- 多執行緒的這些鎖知道嗎?手寫一個自旋鎖?執行緒
- 教你如何進行 linux swap 交換記憶體擴容Linux記憶體
- Python多執行緒與GIL鎖Python執行緒
- Java多執行緒(五):死鎖Java執行緒
- java多執行緒(5)死鎖Java執行緒
- 設定SQLserver執行記憶體SQLServer記憶體
- JAVA多執行緒詳解(3)執行緒同步和鎖Java執行緒
- Java多執行緒中執行緒安全與鎖問題Java執行緒
- 多執行緒程式設計基礎(一)-- 執行緒的使用執行緒程式設計