【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時,線程就釋放了該對象,其他線程才能獲取該鎖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章