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

一文詳細(xì)講解Java中有哪些鎖

 更新時間:2025年07月07日 09:12:49   作者:xzkyd outpaper  
在Java編程中鎖是一種同步機制,用于確保多個線程在訪問共享資源時的一致性和正確性,這篇文章主要介紹了Java中有哪些鎖的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

1. synchronized 鎖

作用
synchronized 是 Java 最基礎(chǔ)的鎖機制,用于實現(xiàn)方法或代碼塊的同步,保證多線程環(huán)境下的原子性、可見性和有序性。

使用方式

  • 對象鎖:修飾實例方法或代碼塊(鎖對象為當(dāng)前實例 this)。

    public synchronized void method() { ... } // 實例方法鎖
    public void method() {
        synchronized (this) { ... }          // 代碼塊鎖(對象鎖)
    }
  • 類鎖:修飾靜態(tài)方法或代碼塊(鎖對象為類的 Class 對象)。

    public static synchronized void staticMethod() { ... } // 靜態(tài)方法鎖
    public void method() {
        synchronized (MyClass.class) { ... } // 代碼塊鎖(類鎖)
    }

特點

  • 隱式鎖:自動獲取和釋放鎖,無需手動管理。

  • 可重入:線程可重復(fù)獲取同一把鎖。

  • 非公平鎖:默認(rèn)搶占式獲取鎖,不保證等待時間長的線程優(yōu)先獲取。

適用場景
簡單同步需求,如單例模式的雙重檢查鎖。

2. ReentrantLock(可重入鎖)

作用
ReentrantLock 是 java.util.concurrent.locks 包下的顯式鎖,提供比 synchronized 更靈活的鎖控制。

使用方式

ReentrantLock lock = new ReentrantLock();
public void method() {
    lock.lock(); // 手動加鎖
    try {
        // 臨界區(qū)代碼
    } finally {
        lock.unlock(); // 必須手動釋放
    }
}

核心功能

  • 嘗試非阻塞獲取鎖tryLock()。

  • 超時獲取鎖tryLock(long timeout, TimeUnit unit)。

  • 公平性選擇:構(gòu)造函數(shù)傳入 true 實現(xiàn)公平鎖(按等待順序分配鎖)。

  • 條件變量:配合 Condition 實現(xiàn)線程間協(xié)調(diào)(如生產(chǎn)者-消費者模型)。

優(yōu)缺點

  • 優(yōu)點:靈活,支持中斷、超時、公平鎖。

  • 缺點:需手動釋放鎖,編碼不當(dāng)易導(dǎo)致死鎖。

適用場景
需要復(fù)雜同步控制的場景,如多條件等待、鎖超時處理。

3. ReadWriteLock(讀寫鎖)

作用

允許多個線程同時讀,但寫線程獨占資源,適用于讀多寫少的場景。

實現(xiàn)類ReentrantReadWriteLock。

使用方式

ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
ReentrantReadWriteLock.ReadLock readLock = rwLock.readLock();
ReentrantReadWriteLock.WriteLock writeLock = rwLock.writeLock();

public void readData() {
    readLock.lock();
    try { ... } finally { readLock.unlock(); }
}

public void writeData() {
    writeLock.lock();
    try { ... } finally { writeLock.unlock(); }
}

特點

  • 讀共享:多個讀線程可同時訪問。

  • 寫?yīng)氄?/strong>:寫線程獲取鎖時,禁止其他讀/寫操作。

  • 鎖降級:寫鎖可降級為讀鎖(反之不可)。

適用場景
緩存系統(tǒng)、頻繁讀取但偶爾更新的數(shù)據(jù)結(jié)構(gòu)。

4. StampedLock(Java 8+)

作用

提供更靈活的讀寫鎖控制,支持樂觀讀、悲觀讀、寫鎖三種模式,性能優(yōu)于 ReadWriteLock。

使用方式

StampedLock stampedLock = new StampedLock();

// 樂觀讀(無鎖)
long stamp = stampedLock.tryOptimisticRead();
if (!stampedLock.validate(stamp)) { // 檢查是否發(fā)生寫操作
    stamp = stampedLock.readLock(); // 退化為悲觀讀
    try { ... } finally { stampedLock.unlockRead(stamp); }
}

// 寫鎖
long writeStamp = stampedLock.writeLock();
try { ... } finally { stampedLock.unlockWrite(writeStamp); }

特點

  • 樂觀讀:假設(shè)沒有寫操作,通過 validate() 驗證。

  • 鎖轉(zhuǎn)換:支持讀鎖與寫鎖的轉(zhuǎn)換(如 tryConvertToWriteLock())。

適用場景
讀多寫少且對性能要求極高的場景,但需謹(jǐn)慎處理鎖轉(zhuǎn)換邏輯。

5. 顯式鎖 vs 隱式鎖

維度顯式鎖(如 ReentrantLock)隱式鎖(synchronized)
鎖獲取方式手動調(diào)用 lock() 和 unlock()自動獲取和釋放
靈活性支持超時、中斷、公平鎖、條件變量僅支持非公平鎖,無超時或中斷機制
性能高并發(fā)場景下更優(yōu)優(yōu)化后性能接近顯式鎖(如鎖升級機制)
代碼復(fù)雜度需手動管理,易出錯自動管理,代碼簡潔

6. 鎖優(yōu)化策略(JVM 對 synchronized 的優(yōu)化)

  • 偏向鎖
    假設(shè)只有一個線程訪問同步塊,通過標(biāo)記線程 ID 避免 CAS 操作。
    適用場景:單線程重復(fù)訪問同步代碼。

  • 輕量級鎖
    當(dāng)多線程競爭時,通過 CAS 自旋嘗試獲取鎖(避免阻塞)。
    適用場景:低競爭、同步塊執(zhí)行時間短。

  • 重量級鎖
    競爭激烈時,線程進(jìn)入阻塞狀態(tài),依賴操作系統(tǒng)的互斥量(Mutex)管理。
    適用場景:高競爭、同步塊執(zhí)行時間長。

鎖升級流程

無鎖 → 偏向鎖 → 輕量級鎖 → 重量級鎖

7. 條件鎖(Condition)

作用
配合顯式鎖(如 ReentrantLock)使用,實現(xiàn)線程的等待/喚醒機制,類似 Object.wait() 和 Object.notify(),但更靈活。

使用方式

ReentrantLock lock = new ReentrantLock();
Condition condition = lock.newCondition();

public void await() throws InterruptedException {
    lock.lock();
    try {
        condition.await(); // 釋放鎖并等待
    } finally { lock.unlock(); }
}

public void signal() {
    lock.lock();
    try {
        condition.signal(); // 喚醒一個等待線程
    } finally { lock.unlock(); }
}

適用場景
生產(chǎn)者-消費者模型、多條件線程協(xié)調(diào)。

8. 分布式鎖

作用

在分布式系統(tǒng)中協(xié)調(diào)多節(jié)點對共享資源的訪問,防止并發(fā)沖突。

實現(xiàn)方式

  • Redis:通過 SETNX(或 RedLock 算法)實現(xiàn)。

    // 使用 Redisson 客戶端
    RLock lock = redisson.getLock("myLock");
    lock.lock();
    try { ... } finally { lock.unlock(); }
  • ZooKeeper:通過臨時有序節(jié)點實現(xiàn)。

  • 數(shù)據(jù)庫:利用唯一索引或樂觀鎖(版本號)。

核心挑戰(zhàn)

  • 死鎖預(yù)防:設(shè)置鎖超時時間。

  • 容錯性:避免單點故障(如 Redis 集群)。

總結(jié)

鎖類型核心特點適用場景
synchronized簡單、自動管理,支持鎖升級優(yōu)化簡單同步需求
ReentrantLock靈活,支持超時、公平鎖、條件變量復(fù)雜同步控制(如多條件等待)
ReadWriteLock讀寫分離,讀多寫少場景性能更優(yōu)緩存、頻繁讀的數(shù)據(jù)結(jié)構(gòu)
StampedLock高性能,支持樂觀讀極高并發(fā)讀場景
分布式鎖跨進(jìn)程、跨節(jié)點協(xié)調(diào)分布式系統(tǒng)資源共享

選擇建議

  • 優(yōu)先使用 synchronized(簡單場景)。

  • 需要靈活控制時選 ReentrantLock

  • 讀多寫少用 ReadWriteLock 或 StampedLock。

  • 分布式環(huán)境用 Redis/ZooKeeper 實現(xiàn)分布式鎖。

到此這篇關(guān)于Java中有哪些鎖的文章就介紹到這了,更多相關(guān)Java有哪些鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決@NonNull @org.jetbrains.annotations.NotNull報紅的問題

    解決@NonNull @org.jetbrains.annotations.NotNull報紅的問題

    這篇文章主要介紹了解決@NonNull @org.jetbrains.annotations.NotNull報紅的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • SpringBoot實現(xiàn)企業(yè)級敏感詞攔截檢查系統(tǒng)的設(shè)計方案

    SpringBoot實現(xiàn)企業(yè)級敏感詞攔截檢查系統(tǒng)的設(shè)計方案

    本文介紹了基于SpringBoot和DFA算法的敏感詞檢測系統(tǒng)設(shè)計,涵蓋業(yè)務(wù)背景、技術(shù)架構(gòu)、核心模塊、數(shù)據(jù)庫設(shè)計、使用示例、監(jiān)控與告警、安全設(shè)計、部署方案等多個方面,旨在實現(xiàn)高效的實時敏感詞檢測,保證內(nèi)容合規(guī)性,提升平臺穩(wěn)定性,需要的朋友可以參考下
    2026-01-01
  • Spring Boot之AOP配自定義注解的最佳實踐過程

    Spring Boot之AOP配自定義注解的最佳實踐過程

    這篇文章主要給大家介紹了關(guān)于Spring Boot之AOP配自定義注解的最佳實踐過程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • MyBatis使用Map與模糊查詢的方法示例

    MyBatis使用Map與模糊查詢的方法示例

    這篇文章主要給大家介紹了關(guān)于MyBatis使用Map與模糊查詢的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 關(guān)于JavaEE匿名內(nèi)部類和Lambda表達(dá)式的注意事項

    關(guān)于JavaEE匿名內(nèi)部類和Lambda表達(dá)式的注意事項

    這篇文章主要介紹了關(guān)于JavaEE匿名內(nèi)部類和Lambda表達(dá)式的注意事項,匿名內(nèi)部類顧名思義是沒有修飾符甚至沒有名稱的內(nèi)部類,使用匿名內(nèi)部類需要注意哪些地方,我們一起來看看吧
    2023-03-03
  • java中新生代和老生代的關(guān)系說明

    java中新生代和老生代的關(guān)系說明

    這篇文章主要介紹了java中新生代和老生代的關(guān)系說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-07-07
  • Spring Boot+Nginx實現(xiàn)大文件下載功能

    Spring Boot+Nginx實現(xiàn)大文件下載功能

    相信很多小伙伴,在日常開放中都會遇到大文件下載的情況,大文件下載方式也有很多,比如非常流行的分片下載、斷點下載;當(dāng)然也可以結(jié)合Nginx來實現(xiàn)大文件下載,在中小項目非常適合使用,這篇文章主要介紹了Spring Boot結(jié)合Nginx實現(xiàn)大文件下載,需要的朋友可以參考下
    2024-05-05
  • 詳解JAVA中的for-each循環(huán)與迭代

    詳解JAVA中的for-each循環(huán)與迭代

    本文詳解了JAVA中的for-each循環(huán)與迭代,是JS入門學(xué)習(xí)中的基礎(chǔ)知識,也是java中的難點知識,需要的朋友可以參考下 。
    2016-10-10
  • 深入學(xué)習(xí)Java單元測試(Junit+Mock+代碼覆蓋率)

    深入學(xué)習(xí)Java單元測試(Junit+Mock+代碼覆蓋率)

    在做單元測試時,代碼覆蓋率常常被拿來作為衡量測試好壞的指標(biāo),甚至,用代碼覆蓋率來考核測試任務(wù)完成情況,比如,代碼覆蓋率必須達(dá)到80%或 90%。下面我們就來詳細(xì)學(xué)習(xí)下java單元測試吧
    2019-06-06
  • SpringMVC配置與使用詳細(xì)介紹

    SpringMVC配置與使用詳細(xì)介紹

    Spring MVC是一個基于Java的實現(xiàn)了MVC設(shè)計模式的請求驅(qū)動類型的輕量級Web框架,通過把Model,View,Controller分離,將web層進(jìn)行職責(zé)解耦,把復(fù)雜的web應(yīng)用分成邏輯清晰的幾部分,簡化開發(fā),減少出錯,方便組內(nèi)配合
    2022-07-07

最新評論

绥阳县| 微山县| 崇州市| 调兵山市| 阜平县| 盐山县| 营口市| 吉林市| 宁晋县| 观塘区| 漾濞| 永和县| 泽州县| 台北县| 榆中县| 丹巴县| 柳江县| 兖州市| 尤溪县| 台中县| 富宁县| 利川市| 隆化县| 大姚县| 成武县| 东乌| 三都| 虹口区| 仁怀市| 寿宁县| 临湘市| 徐水县| 合肥市| 永兴县| 个旧市| 多伦县| 昭平县| 静宁县| 通化县| 长海县| 南皮县|