Udemy Course Multithreading, Concurrency & Performance 23

進階locking-ReentrantLock的lockInterruptibly與tryLock方法

ZONGRU Li
Sep 13, 2021

ReentrantLock.lockInterruptibly()

一般情況下使用lokcObject物件執行.lock()

會因為該物件已經被其他Thread鎖住而無法lock,情況如下

考量本圖Thread中的ReentrantLock的lockObject物件已經被其他Thread執行lock()時

在某些情境下我們會希望當前Thread能夠強制性的搶走lockObject物件鎖

所以可以改執行ReentrantLock.lockInterruptibly():

lockInterruptibly()將強制性地迫使真正持有lock的Thread執行:

...

someThread.interrupt();

並在當前Thread進到catch block進行處理:

此時catch內就是被中斷的someThread後續處理
  1. lockInterruptibly()對於Deadlock的watchdog在做復原非常有用
  2. 針對應用程式啟動Thread做clean或close時非常有用

ReentrantLock.tryLock()

這個Method可以跟一般ReentrantLock.lock()做對比

考量下圖左邊的一般寫法

當lockObject正被其他Thread鎖住時,左邊寫法會卡在紅框處睡著(等待)

但是右邊寫法則會因為lockObject物件被其他Thread鎖住而回false跳到else

tryLock()會嘗試去鎖住,但是如果lockObject已經被其他Thread鎖住就會回false

跳到else後可以做後續其他處理,而不會浪費佔用該Thread放著當花瓶

甚至也能在寫邏輯跳回前面if句做重複動作...etc

若是true則照常進入跑完useResource()後finally解lock

一般情況下讓Thread因為lockObject等待執行.lock()是不可能允許的事

例如:

  1. Vedio/image processing
  2. High Speed/Low latency trading system
  3. User interface application

因為讓Thread懸在那邊等待跑.lock()只是在白白浪費resource

參考課程

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

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

No responses yet