Udemy Course Multithreading, Concurrency & Performance 25

進階locking-ReentrantReadWriteLock(Read Lock&Write Lock)

ZONGRU Li
Sep 16, 2021

考量到之前第19篇的筆記中提到的Race Condition

就是在沒有Lock狀況下,多Thread同時異動同一個resource

最終造成resource結果不如預期

解決辦法就是在時間點內將影響(i.e.read/write/both)resource

的critical section鎖起來

接著我們考量一個實際場景如下:

多個讀取(Reader)的Thread,少量的改寫(Writer)Thread

這種情況下,我們考慮當某一個Reader讀取時

是否該封鎖其他的Reader,以避免出現問題?????

NO!

因為Reader並不影響Resource本身值(或說修改到該Resource,或改變其狀態)

所以一狗票 Readers 同時 去讀取 <-這件事沒有問題

類似如上狀況

  1. 讀取(同一個Resource)這件事在應用程式內是主要任務
  2. 或讀取可能較慢(可能Resource很多個或結構複雜之類的)
  3. 多個讀取Thread互相排斥會對Performance有影響的狀況下

ReentrantReadWriteLock(Read Lock&Write Lock)就可解決問題

首先要先建出ReentrantReadWriteLock物件

再由該物件分拆成Read Lock & Write Lock來使用,邏輯寫法如下

這其中只有readLock那一邊其實是允許多個Reader Thread進入

並且readLock會統計當前進入的Thread數量

亦即當前有多少個Reader Thread在readLock所Lock的critical section內

writeLock部分,只允許單一個Writer Thread進入!

最終會看到如下狀況:

可能狀況1

或是

可能狀況2

下一篇做ReentrantReadWriteLock物件的實際演練,邏輯稍難

但花時間看還是可以理解

參考課程

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet