Udemy Course Multithreading, Concurrency & Performance 22
同前面的lock範例如下:
其中鎖住的部分如下:
但是改用ReentrantLock則可以改造為:
上述寫法比較直觀,由lock()與unlock()來鎖住與解鎖
但是使用上不推薦以下用法:
不推薦寫法1.
不推薦寫法2.
接下來就是推薦寫法:
其他ReentrantLock相關的Query Method方便測試
- getQueuedThreads():return 等待lock的一個list的Thread物件
- getOwner():return 正在持有鎖的Thread
- isHeldBuCurrentThread():Query確認鎖正在被當前的Thread持有
- islock():Query確認鎖被任何Thread持有
Not Fairness:
但是不論是ReentrantLock或是synchronized關鍵字都不保證公平
亦即有N個Threads在排隊進到鎖內執行運算
可能還是有同一個Thread多次進入,其他Threads一直在排隊
第15篇的演練有這張圖:
Fairness:
但是有ReentrantLock(true)這個建構子可以保證進到鎖內是公平的
但是請注意為了確保Threads之間進到鎖內是公平,但是會有多餘的消耗
甚至把運算時間拉長!