Udemy Course Multithreading, Concurrency & Performance 25
考量到之前第19篇的筆記中提到的Race Condition
就是在沒有Lock狀況下,多Thread同時異動同一個resource
最終造成resource結果不如預期
解決辦法就是在時間點內將影響(i.e.read/write/both)resource
的critical section鎖起來
接著我們考量一個實際場景如下:
這種情況下,我們考慮當某一個Reader讀取時
是否該封鎖其他的Reader,以避免出現問題?????
NO!
因為Reader並不影響Resource本身值(或說修改到該Resource,或改變其狀態)
所以一狗票 Readers 同時 去讀取 <-這件事沒有問題
類似如上狀況
- 讀取(同一個Resource)這件事在應用程式內是主要任務
- 或讀取可能較慢(可能Resource很多個或結構複雜之類的)
- 多個讀取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進入!
最終會看到如下狀況:
或是
下一篇做ReentrantReadWriteLock物件的實際演練,邏輯稍難
但花時間看還是可以理解