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

Java中鎖分類及在什么場(chǎng)景下使用

 更新時(shí)間:2026年01月27日 10:48:21   作者:城管不管  
文章詳細(xì)介紹了鎖的進(jìn)階分類,如可重入鎖、樂(lè)觀鎖、公平鎖、讀寫鎖等,并提供了具體的代碼示例,最后,文章給出了實(shí)戰(zhàn)選型指南,幫助開(kāi)發(fā)者根據(jù)具體業(yè)務(wù)場(chǎng)景選擇合適的鎖類型,以達(dá)到最優(yōu)的性能和可維護(hù)性,感興趣的朋友跟隨小編一起看看吧

一、基礎(chǔ)分類(按實(shí)現(xiàn)方式)

這是最核心的分類維度,直接決定鎖的使用方式和核心能力。

1. 內(nèi)置鎖(synchronized)- 隱式鎖

核心定義

Java 關(guān)鍵字,JVM 層面實(shí)現(xiàn)的隱式鎖(無(wú)需手動(dòng)釋放),是最基礎(chǔ)、使用最廣泛的鎖。JDK1.6 后引入「鎖升級(jí)」機(jī)制,性能大幅提升。

核心特點(diǎn)

  • 可重入、默認(rèn)非公平鎖;
  • 自動(dòng)加鎖 / 解鎖(方法 / 代碼塊執(zhí)行完自動(dòng)釋放,無(wú)需手動(dòng)處理);
  • 底層依賴對(duì)象頭的Mark Word + 監(jiān)視器鎖(ObjectMonitor);
  • 支持鎖升級(jí)(偏向鎖→輕量級(jí)鎖→重量級(jí)鎖),適配不同并發(fā)場(chǎng)景。

適用場(chǎng)景

  • 簡(jiǎn)單互斥場(chǎng)景(如方法 / 代碼塊的線程安全);
  • 并發(fā)度不高、代碼簡(jiǎn)潔性優(yōu)先的場(chǎng)景;
  • 不需要靈活特性(如可中斷、超時(shí)獲取鎖)的場(chǎng)景;
  • 絕大多數(shù)普通業(yè)務(wù)場(chǎng)景(JVM 優(yōu)化后性能接近顯式鎖)。

代碼示例

public class SynchronizedDemo {
    // 1. 實(shí)例方法鎖(對(duì)象鎖):鎖當(dāng)前實(shí)例對(duì)象
    public synchronized void objectLock() {
        System.out.println(Thread.currentThread().getName() + "獲取對(duì)象鎖");
        try { Thread.sleep(100); } catch (InterruptedException e) {}
    }
    // 2. 靜態(tài)方法鎖(類鎖):鎖當(dāng)前類的Class對(duì)象
    public static synchronized void classLock() {
        System.out.println(Thread.currentThread().getName() + "獲取類鎖");
        try { Thread.sleep(100); } catch (InterruptedException e) {}
    }
    // 3. 代碼塊鎖:自定義鎖對(duì)象(靈活度最高)
    private final Object lockObj = new Object();
    public void blockLock() {
        synchronized (lockObj) {
            System.out.println(Thread.currentThread().getName() + "獲取代碼塊鎖");
            try { Thread.sleep(100); } catch (InterruptedException e) {}
        }
    }
    public static void main(String[] args) {
        SynchronizedDemo demo = new SynchronizedDemo();
        // 競(jìng)爭(zhēng)同一對(duì)象鎖,串行執(zhí)行
        new Thread(demo::objectLock, "線程1").start();
        new Thread(demo::objectLock, "線程2").start();
    }
}

2. 顯式鎖(Lock 接口)- 手動(dòng)鎖

核心定義

JUC 包下java.util.concurrent.locks.Lock接口的實(shí)現(xiàn)類,手動(dòng)加鎖 / 釋放鎖(需在finally中釋放,避免死鎖),是 synchronized 的補(bǔ)充和增強(qiáng)。

核心實(shí)現(xiàn)類 & 特點(diǎn)

實(shí)現(xiàn)類核心特性
ReentrantLock可重入、支持公平 / 非公平、可中斷、超時(shí)獲取鎖
ReentrantReadWriteLock讀寫分離(讀共享、寫?yīng)氄迹?、可重?/td>
StampedLock支持樂(lè)觀讀、讀寫鎖、寫鎖,性能優(yōu)于讀寫鎖

適用場(chǎng)景

  • 需要靈活鎖控制(如可中斷、超時(shí)獲取鎖、公平鎖)的場(chǎng)景;
  • 讀多寫少的高并發(fā)場(chǎng)景(選 ReentrantReadWriteLock/StampedLock);
  • 高并發(fā)、需要精細(xì)控制鎖生命周期的場(chǎng)景。

代碼示例(ReentrantLock)

import java.util.concurrent.locks.ReentrantLock;
public class ReentrantLockDemo {
    // 公平鎖(按請(qǐng)求順序獲?。?,默認(rèn)非公平鎖(性能更高)
    private static final ReentrantLock lock = new ReentrantLock(true);
    public static void doTask() {
        // 1. 加鎖(可替換為lockInterruptibly():可中斷鎖)
        lock.lock();
        try {
            System.out.println(Thread.currentThread().getName() + "獲取鎖");
            // 模擬業(yè)務(wù)操作
            Thread.sleep(100);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt(); // 恢復(fù)中斷狀態(tài)
        } finally {
            // 2. 釋放鎖(必須放finally,否則死鎖)
            if (lock.isHeldByCurrentThread()) {
                lock.unlock();
                System.out.println(Thread.currentThread().getName() + "釋放鎖");
            }
        }
    }
    public static void main(String[] args) {
        new Thread(ReentrantLockDemo::doTask, "線程A").start();
        new Thread(ReentrantLockDemo::doTask, "線程B").start();
    }
}

二、進(jìn)階分類(按鎖的核心特性)

基于鎖的行為和并發(fā)特性分類,幫你理解鎖的底層邏輯和適用場(chǎng)景。

1. 可重入鎖 vs 不可重入鎖

類型定義示例適用場(chǎng)景
可重入鎖同一線程可多次獲取同一把鎖,不會(huì)死鎖synchronized、ReentrantLock所有業(yè)務(wù)場(chǎng)景(遞歸調(diào)用、同一線程多次操作共享資源)
不可重入鎖同一線程多次獲取同一鎖會(huì)死鎖自定義簡(jiǎn)單自旋鎖(未處理重入)極少使用(僅嚴(yán)格限制鎖獲取次數(shù)的特殊場(chǎng)景)

可重入鎖示例(synchronized 遞歸調(diào)用)

public class ReentrantDemo {
    public synchronized void outer() {
        System.out.println("外層方法獲取鎖");
        inner(); // 同一線程再次獲取同一鎖,無(wú)死鎖
    }
    public synchronized void inner() {
        System.out.println("內(nèi)層方法獲取鎖");
    }
    public static void main(String[] args) {
        new ReentrantDemo().outer(); // 正常執(zhí)行,無(wú)死鎖
    }
}

2. 樂(lè)觀鎖 vs 悲觀鎖

這是并發(fā)設(shè)計(jì)思想的分類,而非具體鎖實(shí)現(xiàn)。

類型核心思想實(shí)現(xiàn)方式適用場(chǎng)景
悲觀鎖假設(shè)必有競(jìng)爭(zhēng),先鎖后執(zhí)行synchronized、ReentrantLock高沖突、寫多讀少(如庫(kù)存扣減、轉(zhuǎn)賬)
樂(lè)觀鎖假設(shè)無(wú)競(jìng)爭(zhēng),先執(zhí)行后檢測(cè)CAS(Atomic 類)、版本號(hào)低沖突、讀多寫少(如計(jì)數(shù)器、緩存更新)

樂(lè)觀鎖示例(CAS 實(shí)現(xiàn))

import java.util.concurrent.atomic.AtomicInteger;
public class OptimisticLockDemo {
    // CAS是樂(lè)觀鎖的核心實(shí)現(xiàn)
    private static final AtomicInteger count = new AtomicInteger(0);
    // 原子自增(無(wú)鎖,沖突時(shí)重試)
    public static void increment() {
        count.incrementAndGet();
    }
    public static void main(String[] args) throws InterruptedException {
        Runnable task = () -> {
            for (int i = 0; i < 1000; i++) increment();
        };
        Thread t1 = new Thread(task);
        Thread t2 = new Thread(task);
        t1.start(); t2.start();
        t1.join(); t2.join();
        System.out.println("最終計(jì)數(shù):" + count.get()); // 2000(線程安全)
    }
}

3. 公平鎖 vs 非公平鎖

類型定義示例適用場(chǎng)景
公平鎖按請(qǐng)求順序獲取鎖,先到先得ReentrantLock(true)對(duì)公平性要求高(如任務(wù)排隊(duì)、避免線程饑餓)
非公平鎖不按順序,線程可插隊(duì)獲取鎖synchronized、ReentrantLock()大部分場(chǎng)景(優(yōu)先性能,容忍輕微饑餓)

4. 讀寫鎖(ReentrantReadWriteLock)- 共享 + 獨(dú)占鎖

核心定義

將鎖拆分為「讀鎖(共享鎖)」和「寫鎖(獨(dú)占鎖)」,核心規(guī)則:

  • 讀 - 讀共享:多個(gè)線程可同時(shí)獲取讀鎖;
  • 讀 - 寫互斥:讀鎖和寫鎖不能同時(shí)持有;
  • 寫 - 寫互斥:多個(gè)線程不能同時(shí)獲取寫鎖。

適用場(chǎng)景

讀多寫少的場(chǎng)景(如緩存、配置讀取、商品詳情頁(yè)、數(shù)據(jù)查詢),相比普通獨(dú)占鎖,能大幅提升讀并發(fā)效率。

代碼示例

import java.util.concurrent.locks.ReentrantReadWriteLock;
public class ReadWriteLockDemo {
    private static final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
    private static final ReentrantReadWriteLock.ReadLock readLock = rwLock.readLock();
    private static final ReentrantReadWriteLock.WriteLock writeLock = rwLock.writeLock();
    private static int cacheData = 0; // 模擬緩存數(shù)據(jù)
    // 讀操作(共享鎖,多線程同時(shí)執(zhí)行)
    public static void readCache() {
        readLock.lock();
        try {
            System.out.println(Thread.currentThread().getName() + "讀取緩存:" + cacheData);
            Thread.sleep(200); // 模擬讀耗時(shí)
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        } finally {
            readLock.unlock();
        }
    }
    // 寫操作(獨(dú)占鎖,串行執(zhí)行)
    public static void updateCache(int newData) {
        writeLock.lock();
        try {
            System.out.println(Thread.currentThread().getName() + "更新緩存:" + newData);
            cacheData = newData;
            Thread.sleep(200); // 模擬寫耗時(shí)
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        } finally {
            writeLock.unlock();
        }
    }
    public static void main(String[] args) {
        // 5個(gè)讀線程(可同時(shí)執(zhí)行,并發(fā)效率高)
        for (int i = 0; i < 5; i++) {
            new Thread(ReadWriteLockDemo::readCache, "讀線程" + i).start();
        }
        // 1個(gè)寫線程(獨(dú)占,所有讀線程等待)
        new Thread(() -> updateCache(100), "寫線程").start();
    }
}

5. synchronized 的鎖升級(jí)(偏向鎖→輕量級(jí)鎖→重量級(jí)鎖)

JDK1.6 為優(yōu)化 synchronized 引入的自適應(yīng)鎖機(jī)制,鎖級(jí)別從低到高升級(jí)(不可逆),適配不同并發(fā)場(chǎng)景:

鎖類型核心特點(diǎn)適用場(chǎng)景
偏向鎖鎖偏向第一個(gè)線程,無(wú)競(jìng)爭(zhēng)時(shí)零開(kāi)銷單線程執(zhí)行同步代碼(如初始化資源)
輕量級(jí)鎖多線程交替競(jìng)爭(zhēng),CAS 自旋獲取鎖少量線程(2-3 個(gè))交替執(zhí)行
重量級(jí)鎖多線程激烈競(jìng)爭(zhēng),線程阻塞(OS 層面)大量線程同時(shí)競(jìng)爭(zhēng)鎖

6. 自旋鎖 vs 阻塞鎖

類型定義示例適用場(chǎng)景
自旋鎖獲取鎖失敗時(shí)循環(huán)重試(自旋),不阻塞CAS、synchronized 輕量級(jí)鎖鎖持有時(shí)間短、低沖突(如簡(jiǎn)單變量更新)
阻塞鎖獲取鎖失敗時(shí)線程阻塞,釋放 CPUsynchronized 重量級(jí)鎖、ReentrantLock鎖持有時(shí)間長(zhǎng)、高沖突(如復(fù)雜業(yè)務(wù)邏輯)

7. 分段鎖(ConcurrentHashMap JDK1.7)

核心定義

將數(shù)據(jù)拆分為多個(gè)「段(Segment)」,每個(gè)段獨(dú)立加鎖,不同段的操作互不阻塞,并發(fā)度 = 段數(shù)(默認(rèn) 16)。

適用場(chǎng)景

JDK1.7 的 ConcurrentHashMap(JDK1.8 后用 CAS+Synchronized 替代),適用于高并發(fā)讀寫 Map 的場(chǎng)景。

三、實(shí)戰(zhàn)選型指南(核心)

業(yè)務(wù)場(chǎng)景推薦鎖類型選型原因
簡(jiǎn)單互斥、代碼簡(jiǎn)潔synchronized隱式鎖,無(wú)需手動(dòng)釋放,JVM 優(yōu)化優(yōu)異
可中斷 / 超時(shí) / 公平鎖ReentrantLock支持靈活的鎖控制特性
讀多寫少(緩存 / 查詢)ReentrantReadWriteLock/StampedLock讀共享,大幅提升讀并發(fā)效率
低沖突、簡(jiǎn)單變量更新CAS(AtomicInteger/AtomicLong)無(wú)鎖,性能最高,避免自旋消耗
高沖突、寫多讀少(轉(zhuǎn)賬)synchronized/ReentrantLock悲觀鎖,避免高沖突下的 CAS 自旋 CPU 開(kāi)銷
公平性要求高(任務(wù)排隊(duì))ReentrantLock(true)按請(qǐng)求順序獲取鎖,避免線程饑餓
高并發(fā) Map 操作ConcurrentHashMapJDK1.8 用 CAS+Synchronized,兼顧性能和安全性

總結(jié)

關(guān)鍵點(diǎn)回顧

  1. 基礎(chǔ)核心:synchronized(簡(jiǎn)單、通用)和 Lock 接口(靈活、高級(jí))是 Java 鎖的兩大基石,前者適用于普通場(chǎng)景,后者適用于需要靈活控制的場(chǎng)景;
  2. 特性選型:讀多寫少選讀寫鎖,低沖突選樂(lè)觀鎖 / CAS,高沖突選悲觀鎖,公平性要求高選公平鎖;
  3. 性能原則:優(yōu)先選擇「開(kāi)銷低」的鎖(如偏向鎖、CAS),高沖突場(chǎng)景才用「高開(kāi)銷」的阻塞鎖(如重量級(jí)鎖);
  4. 實(shí)戰(zhàn)建議:90% 的普通業(yè)務(wù)場(chǎng)景用 synchronized 即可,僅在需要可中斷、超時(shí)、讀寫分離時(shí)才用 Lock 接口實(shí)現(xiàn)類。

到此這篇關(guān)于Java中鎖分類及在什么場(chǎng)景下使用的文章就介紹到這了,更多相關(guān)java鎖使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

镇坪县| 睢宁县| 宿松县| 蕲春县| 永兴县| 积石山| 汽车| 井研县| 嵊泗县| 隆德县| 金溪县| 镇远县| 株洲市| 石家庄市| 朝阳区| 喀什市| 伊金霍洛旗| 阿克陶县| 仙桃市| 陇川县| 泰来县| 宣恩县| 炉霍县| 威宁| 长顺县| 台东县| 洛阳市| 巫山县| 平塘县| 南木林县| 定州市| 如皋市| 丹东市| 乌海市| 祁门县| 嘉祥县| 富民县| 宜昌市| 休宁县| 巴里| 阿克苏市|