1. 程式人生 > >【java】——什麼是可重入鎖以及實際應用場景

【java】——什麼是可重入鎖以及實際應用場景

首先鎖是針對執行緒的,即只有執行緒才有鎖的概念。

什麼是可重入鎖呢?

當一個執行緒獲取了某個物件鎖以後,還可以再次獲得該物件鎖。

什麼時候我們會用到可重入鎖呢?

看下面的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時,執行緒就釋放了該物件,其他執行緒才能獲取該鎖