Java併發——鎖框架(二)重入鎖ReentrantLock
阿新 • • 發佈:2018-12-23
1. 重入鎖
重入鎖,顧名思義,就是支援重進入的鎖,它表示該鎖能夠支援一個執行緒對資源的重複加鎖。重進入是指任意執行緒在獲取到鎖之後能夠再次獲取該鎖而不會被鎖阻塞。兩個關鍵問題:
(1)執行緒再次獲取鎖。當一條執行緒持有這個鎖並且呼叫lock()、lockUninterruptibly()或者任意一個tryLock()方法重新獲取鎖,這個鎖的持有量就遞增1.
(2)釋放鎖。當執行緒呼叫unlock()方法,持有量就遞減1.當持有量降為0,鎖就會被釋放掉。
類ReentrantLock實現了重入鎖。
2.重入鎖的優勢
在高執行緒爭用的環境下具有更好的效能。當很多執行緒嘗試訪問共享資源時,JVM會花費更少的時間來排程這些執行緒,而把更多的時間用於執行它們。
可重入鎖最大的作用是避免死鎖。
3. 常用方法
(1) ReentrantLock():建立一個ReentrantLock例項。
(2)ReentrantLock(boolean fair):建立一個擁有指定公平策略的ReentrantLock的例項。當這個鎖需要使用公平的排序策略時,給fair賦值為true。在爭用的環境下,這個鎖傾向於將訪問許可權分配給等待最久的執行緒。
(3) isFair():返回公平策略。
(4)boolean isHeldByCurrentThread():返回當前執行緒是否持有鎖。
此外,ReentrantLock實現了Lock介面的所有方法。
4.使用
這篇博文講的很詳細:https://blog.csdn.net/ONROAD0612/article/details/78149798?locationNum=8&fps=1
一個簡單例子
import java.util.concurrent.locks.ReentrantLock; public class ReentrantLockDemo { private ReentrantLock lock = new ReentrantLock(); public void method1(){ lock.lock(); try { System.out.println("方法1正常執行!"); method2(); } finally { lock.unlock(); } } public void method2() { lock.lock(); try { System.out.println("方法1中呼叫的方法2也正常執行!"); } finally { lock.unlock(); } } public static void main(String[] args) { new ReentrantLockDemo().method1(); } }
執行結果:
方法1正常執行!
方法1中呼叫的方法2也正常執行!