Udemy Course Multithreading, Concurrency & Performance 23
ReentrantLock.lockInterruptibly()
一般情況下使用lokcObject物件執行.lock()
會因為該物件已經被其他Thread鎖住而無法lock,情況如下
在某些情境下我們會希望當前Thread能夠強制性的搶走lockObject物件鎖
所以可以改執行ReentrantLock.lockInterruptibly():
lockInterruptibly()將強制性地迫使真正持有lock的Thread執行:
...
someThread.interrupt();
並在當前Thread進到catch block進行處理:
- lockInterruptibly()對於Deadlock的watchdog在做復原非常有用
- 針對應用程式啟動Thread做clean或close時非常有用
ReentrantLock.tryLock()
這個Method可以跟一般ReentrantLock.lock()做對比
考量下圖左邊的一般寫法
但是右邊寫法則會因為lockObject物件被其他Thread鎖住而回false跳到else
跳到else後可以做後續其他處理,而不會浪費佔用該Thread放著當花瓶
甚至也能在寫邏輯跳回前面if句做重複動作...etc
若是true則照常進入跑完useResource()後finally解lock
一般情況下讓Thread因為lockObject等待執行.lock()是不可能允許的事
例如:
- Vedio/image processing
- High Speed/Low latency trading system
- User interface application
因為讓Thread懸在那邊等待跑.lock()只是在白白浪費resource