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

Java ReentrantLock的可重入性與公平鎖機(jī)制詳解

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

1.ReentrantLock介紹

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

2.ReentrantLock核心特性

2.1可重入性

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

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

2.2公平性選擇

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

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

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

2.3中斷響應(yīng)

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

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

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

2.4超時(shí)機(jī)制

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

3.ReentrantLock基本使用方法

我們來(lái)模擬一個(gè)簡(jiǎn)單的多線程環(huán)境下對(duì)單一共享變量做更改的場(chǎng)景

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類(lèi)似,其本質(zhì)都是將需保證線程安全的變量放到代碼塊中,使用鎖將代碼塊包裹。不一樣的點(diǎn)在于Reentrantlock需要手動(dòng)釋放鎖,為了保證每次使用鎖后安全地釋放,我們使用finally關(guān)鍵字去實(shí)現(xiàn)鎖的釋放。

4.ReentrantLock和sychronized對(duì)比

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

ReentrantLock與synchronized對(duì)比

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

雖說(shuō)在性能上二者相差無(wú)幾,但是ReentrantLock提供了更多可選的功能,靈活性要比傳統(tǒng)synchronized鎖要更高,所以在大部分場(chǎng)景中,我們會(huì)選擇使用ReentrantLock作為第一選擇,而synchronized因?yàn)槠溆兄詣?dòng)獲取和釋放鎖的優(yōu)勢(shì),在簡(jiǎn)單的業(yè)務(wù)場(chǎng)景中會(huì)經(jīng)??匆?jiàn)它的身影。

5.ReentrantLock使用主要事項(xiàng)

5.1鎖的釋放

由于ReentrantLock沒(méi)有提供自動(dòng)獲取和釋放鎖,所以在每次使用完后必須手動(dòng)釋放

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

5.2鎖的層級(jí)嵌套

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

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

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

相關(guān)文章

最新評(píng)論

两当县| 剑川县| 星子县| 高州市| 景德镇市| 如皋市| 怀安县| 资溪县| 喀什市| 安远县| 德州市| 米林县| 麻江县| 武定县| 兴山县| 芜湖县| 昌乐县| 江西省| 化州市| 齐河县| 南和县| 原平市| 拜泉县| 尼勒克县| 望奎县| 乐清市| 望都县| 沾益县| 遂平县| 通化县| 武胜县| 华容县| 金山区| 金阳县| 天台县| 岗巴县| 鹿泉市| 芦山县| 宁国市| 靖宇县| 方城县|