教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

ReentrantLock是如何實(shí)現(xiàn)可重入性的?

更新時間:2023年04月11日11時31分 來源:傳智教育 瀏覽次數(shù):

好口碑IT培訓(xùn)

  ReentrantLock實(shí)現(xiàn)可重入性的關(guān)鍵是使用了一個計(jì)數(shù)器來記錄當(dāng)前線程重入的次數(shù),即每當(dāng)一個線程獲取到鎖時,它的重入計(jì)數(shù)器會加1,當(dāng)這個線程再次請求鎖時,它會再次獲得鎖而不被阻塞,同時重入計(jì)數(shù)器繼續(xù)加1。當(dāng)線程退出鎖保護(hù)的代碼塊時,計(jì)數(shù)器遞減,直到計(jì)數(shù)器降為0時,鎖才被完全釋放。

  下面是一個簡單的Java代碼演示ReentrantLock的可重入性:

import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockDemo {
    private ReentrantLock lock = new ReentrantLock();
    private int count = 0;

    public void increment() {
        lock.lock(); // 獲取鎖
        try {
            count++;
            System.out.println(Thread.currentThread().getName() + " count = " + count);
            increment(); // 遞歸調(diào)用,測試ReentrantLock的可重入性
        } finally {
            lock.unlock(); // 釋放鎖
        }
    }

    public static void main(String[] args) {
        final ReentrantLockDemo demo = new ReentrantLockDemo();

        // 創(chuàng)建兩個線程,同時調(diào)用increment()方法
        new Thread(new Runnable() {
            public void run() {
                demo.increment();
            }
        }).start();

        new Thread(new Runnable() {
            public void run() {
                demo.increment();
            }
        }).start();
    }
}

  在這個例子中,我們創(chuàng)建了一個ReentrantLock對象來保護(hù)一個共享資源count,并在increment()方法中獲取鎖。在increment()方法中,我們遞歸調(diào)用increment()方法來測試ReentrantLock的可重入性。

ReentrantLock是如何實(shí)現(xiàn)可重入性的?

  運(yùn)行程序后,你會發(fā)現(xiàn)兩個線程會不斷遞歸調(diào)用increment()方法,每個線程會自己維護(hù)一個計(jì)數(shù)器。這就是ReentrantLock的可重入性的體現(xiàn),每個線程可以重復(fù)獲取鎖,而不會被阻塞。當(dāng)程序遞歸調(diào)用次數(shù)達(dá)到一定值時,將會拋出StackOverflowError異常。

0 分享到:
和我們在線交談!