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

全國(guó)咨詢/投訴熱線:400-618-4000

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

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

好口碑IT培訓(xùn)

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

  下面是一個(gè)簡(jiǎn)單的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)用,測(cè)試ReentrantLock的可重入性
        } finally {
            lock.unlock(); // 釋放鎖
        }
    }

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

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

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

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

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

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

0 分享到:
和我們?cè)诰€交談!