【java】——什麼是可重入鎖以及實際應用場景
阿新 • • 發佈:2018-12-20
首先鎖是針對執行緒的,即只有執行緒才有鎖的概念。
什麼是可重入鎖呢?
當一個執行緒獲取了某個物件鎖以後,還可以再次獲得該物件鎖。
什麼時候我們會用到可重入鎖呢?
看下面的demo
public class Demo1 { public synchronized void functionA(){ System.out.println("iAmFunctionA"); functionB(); } public synchronized void functionB(){ System.out.println("iAmFunctionB"); } }
程式碼解釋
functionA()和functionB()都是同步方法,當執行緒進入funcitonA()會獲得該類的物件鎖,這個鎖"new Demo1()",在functionA()對方法functionB()做了呼叫,但是functionB()也是同步的,因此該執行緒需要再次獲得該物件鎖(new Demo1())。其他執行緒是無法獲該物件鎖的。
這就是可衝入鎖。
可重入鎖的作用就是為了避免死鎖,java中synchronized和ReentrantLock都是可重入鎖
重入鎖的實現原理
通過為每個鎖關聯一個請求計數器和一個獲得該鎖的執行緒。當計數器為0時,認為鎖是未被佔用的。執行緒請求一個未被佔用的鎖時,JVM將記錄該執行緒並將請求計數器設定為1,此時該執行緒就獲得了鎖,當該執行緒再次請求這個鎖,計數器將遞增,當執行緒退出同步方法或者同步程式碼塊時,計數器將遞減,當計數器為0時,執行緒就釋放了該物件,其他執行緒才能獲取該鎖