Udemy Course Multithreading, Concurrency & Performance 22

進階locking-ReentrantLock與Thread Lock公平性

ZONGRU Li
Sep 3, 2021

同前面的lock範例如下:

其中鎖住的部分如下:

但是改用ReentrantLock則可以改造為:

上述寫法比較直觀,由lock()unlock()來鎖住與解鎖

但是使用上不推薦以下用法:

不推薦寫法1.

永遠鎖住形成bug/deadlock

不推薦寫法2.

接下來就是推薦寫法:

利用try catch block的finally必定會執行的部分解鎖

其他ReentrantLock相關的Query Method方便測試

  1. getQueuedThreads():return 等待lock的一個list的Thread物件
  2. getOwner():return 正在持有鎖的Thread
  3. isHeldBuCurrentThread():Query確認鎖正在被當前的Thread持有
  4. islock():Query確認鎖被任何Thread持有

Not Fairness:

但是不論是ReentrantLock或是synchronized關鍵字都不保證公平

亦即有N個Threads在排隊進到鎖內執行運算

可能還是有同一個Thread多次進入,其他Threads一直在排隊

這部分可以參考我第15篇中間的演練:

第15篇的演練有這張圖:

Fairness:

但是有ReentrantLock(true)這個建構子可以保證進到鎖內是公平的

但是請注意為了確保Threads之間進到鎖內是公平,但是會有多餘的消耗

甚至把運算時間拉長!

參考課程

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

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

No responses yet