【線程基礎】如何理解可重入鎖?

可重入鎖

廣義上的可重入鎖指的是可重複可遞歸調用的鎖,在外層使用鎖以後,在內層仍然能夠使用,而且不發生死鎖(前提得是同一個對象或者class),這樣的鎖就叫作可重入鎖。ReentrantLock和synchronized都是可重入鎖,下面是一個用synchronized實現的例子:bash

synchronized的可重入性

synchronized是JVM內置鎖。ui

可重入性的實現方式是,synchronized會爲每個鎖關聯一個獲取計數器和全部者線程,其餘線程調用會阻塞;若是相同的線程再次調用這個鎖,計數值遞增;退出時,遞減,當計數爲0時,鎖會被釋放,spa

public class ReentrantTest implements Runnable {

    public synchronized void get() {
        System.out.println(Thread.currentThread().getName());
        set();
    }

    public synchronized void set() {
        System.out.println(Thread.currentThread().getName());
    }

    public void run() {
        get();
    }

    public static void main(String[] args) {
        ReentrantTest rt = new ReentrantTest();
        for(;;){
            new Thread(rt).start();
        }
    }
}
複製代碼
相關文章
相關標籤/搜索