最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java ReentrantLock的可重入性與公平鎖機制詳解

 更新時間:2026年02月14日 15:34:34   作者:曄子yy  
這篇文章主要介紹了Java ReentrantLock的可重入性與公平鎖機制,Java中的ReentrantLock是一個可重入的互斥鎖,基于AQS實現(xiàn),它允許同一線程多次獲取同一把鎖,并控制加鎖與釋放,支持公平/非公平策略及tryLock等靈活特性,需要的朋友可以參考下

1.ReentrantLock介紹

ReentrantLock? 是Java 并發(fā)包(java.util.concurrent.locks)中提供的一個可重入互斥鎖,功能類似于synchronized關(guān)鍵字,但提供了更靈活的鎖控制機制。

2.ReentrantLock核心特性

2.1可重入性

同一個線程可以多次獲取同一把鎖,而不會產(chǎn)生死鎖

ReentrantLock lock = new ReentrantLock();
public void func1() {
    lock.lock();
    try {
        inner();
    } finally {
        lock.unlock();
    }
}
public void func2() {
    lock.lock();  // 同一個線程可以再次獲取鎖
    try {
        // 操作
    } finally {
        lock.unlock();
    }
}

2.2公平性選擇

支持公平鎖和非公平鎖兩種模式

默認(rèn)使用非公平鎖,非公平鎖和公平鎖的區(qū)別在于公平鎖多了判斷在等待隊列中是否已經(jīng)有線程在排隊的條件。

  • 非公平鎖:默認(rèn),吞吐量高
  • 公平鎖:按等待時間分配,避免饑餓
// 非公平鎖
ReentrantLock unfairLock = new ReentrantLock();
// 公平鎖
ReentrantLock fairLock = new ReentrantLock(true);

2.3中斷響應(yīng)

支持在等待鎖的過程中響應(yīng)中斷

使用lock.lockInterruptibly()即可設(shè)置可中斷的獲取鎖

public void method() throws InterruptedException {
    lock.lockInterruptibly();  // 可中斷的獲取鎖
    try {
        // 操作
    } finally {
        lock.unlock();
    }
}

2.4超時機制

  • tryLock():立即返回是否獲取成功
  • tryLock(long timeout, TimeUnit unit):帶超時的嘗試

3.ReentrantLock基本使用方法

我們來模擬一個簡單的多線程環(huán)境下對單一共享變量做更改的場景

public class Counter {
    private final ReentrantLock lock = new ReentrantLock();
    private int count = 0;
    public void increment() {
        lock.lock();  // 獲取鎖
        try {
            count++;
        } finally {
            lock.unlock();  // 必須放在finally中確保釋放
        }
    }
}

和sychronized類似,其本質(zhì)都是將需保證線程安全的變量放到代碼塊中,使用鎖將代碼塊包裹。不一樣的點在于Reentrantlock需要手動釋放鎖,為了保證每次使用鎖后安全地釋放,我們使用finally關(guān)鍵字去實現(xiàn)鎖的釋放。

4.ReentrantLock和sychronized對比

synchronized和ReentrantLock都是Java 中提供的可重入鎖,但卻有著較多的不同點

ReentrantLock與synchronized對比

ReentrantLocksynchronized
實現(xiàn)方式Java代碼實現(xiàn)JVM內(nèi)置(C/C++)
鎖獲取方式手動 lock()/unlock()自動獲取/釋放
可中斷性lockInterruptibly()不支持
超時機制tryLock()不支持
公平鎖支持不支持
性能優(yōu)化AQS+CAS鎖升級

雖說在性能上二者相差無幾,但是ReentrantLock提供了更多可選的功能,靈活性要比傳統(tǒng)synchronized鎖要更高,所以在大部分場景中,我們會選擇使用ReentrantLock作為第一選擇,而synchronized因為其有著自動獲取和釋放鎖的優(yōu)勢,在簡單的業(yè)務(wù)場景中會經(jīng)??匆娝纳碛?。

5.ReentrantLock使用主要事項

5.1鎖的釋放

由于ReentrantLock沒有提供自動獲取和釋放鎖,所以在每次使用完后必須手動釋放

lock.lock();
try {
    // 臨界區(qū)代碼
} finally {
    lock.unlock();
}

5.2鎖的層級嵌套

雖然ReentrantLock支持可重入鎖,但是隨著嵌套層級增加,代碼可讀性會大大下降

//嵌套層次過深
public void methodA() {
    lock.lock();
    try {
        methodB();
    } finally {
        lock.unlock();
    }
}
public void methodB() {
    lock.lock();  // 再次獲取
    try {
        // ...
    } finally {
        lock.unlock();
    }
}

以上就是Java ReentrantLock的可重入性與公平鎖機制詳解的詳細(xì)內(nèi)容,更多關(guān)于Java ReentrantLock的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

桂林市| 英超| 饶阳县| 台安县| 宁海县| 安塞县| 安塞县| 吴桥县| 玉屏| 颍上县| 剑阁县| 龙江县| 鸡西市| 五大连池市| 清水河县| 武穴市| 离岛区| 青岛市| 武平县| 建平县| 灵山县| 湛江市| 罗源县| 平原县| 滨州市| 阆中市| 星子县| 玉门市| 石景山区| 清徐县| 公主岭市| 麻城市| 秦皇岛市| 鱼台县| 新泰市| 宜兰县| 广元市| 盖州市| 东阳市| 垫江县| 广宗县|