Java中常見的鎖synchronized、ReentrantLock、ReentrantReadWriteLock、StampedLock

在Java中,鎖是實現多線程同步的核心機制。不同的鎖適用于不同的場景,理解其實現原理和使用方法對優化性能和避免并發問題至關重要。


一、隱式鎖:synchronized 關鍵字

實現原理
  • 基于對象監視器(Monitor):每個Java對象都有一個內置的監視器鎖(monitor lock),通過 synchronized 關鍵字獲取。
  • 鎖升級機制(JVM優化):
    • 偏向鎖:無競爭時,標記線程ID,避免CAS操作。
    • 輕量級鎖:通過CAS競爭鎖,失敗后升級為重量級鎖。
    • 重量級鎖:通過操作系統互斥量(mutex)實現線程阻塞。
使用方法
// 1. 同步代碼塊
synchronized (obj) { // 臨界區代碼
}// 2. 同步實例方法
public synchronized void method() { }// 3. 同步靜態方法
public static synchronized void method() { }
適用場景
  • 簡單同步需求:無需復雜鎖功能的場景(如可中斷、超時等)。
  • 代碼簡潔性優先:自動釋放鎖,避免忘記解鎖的風險。

二、顯式鎖:ReentrantLock

實現原理
  • 基于AQS(AbstractQueuedSynchronizer)
    • 通過 state 變量(CAS操作)記錄鎖狀態。
    • 使用CLH隊列管理等待線程。
  • 支持公平性:可選擇公平鎖(按排隊順序獲取)或非公平鎖(插隊競爭)。
使用方法
ReentrantLock lock = new ReentrantLock();
lock.lock();
try {// 臨界區代碼
} finally {lock.unlock(); // 必須手動釋放
}// 高級功能示例:嘗試獲取鎖
if (lock.tryLock(1, TimeUnit.SECONDS)) {try { /* ... */ } finally { lock.unlock(); }
}
適用場景
  • 復雜鎖需求:需要可中斷、超時、公平性等特性。
  • 細粒度控制:如跨方法加鎖解鎖(synchronized 只能在代碼塊內)。

三、讀寫鎖:ReentrantReadWriteLock

實現原理
  • 分離讀鎖(共享)和寫鎖(獨占)
    • 讀鎖允許多線程并發讀,寫鎖獨占。
    • AQS的 state 高16位記錄讀鎖,低16位記錄寫鎖。
使用方法
ReadWriteLock rwLock = new ReentrantReadWriteLock();
Lock readLock = rwLock.readLock();
Lock writeLock = rwLock.writeLock();// 讀操作
readLock.lock();
try { /* 讀數據 */ } finally { readLock.unlock(); }// 寫操作
writeLock.lock();
try { /* 寫數據 */ } finally { writeLock.unlock(); }
適用場景
  • 讀多寫少:如緩存系統、高頻查詢場景。
  • 數據一致性要求:寫操作需要互斥,讀操作可并發。

四、樂觀鎖:StampedLock(Java 8+)

實現原理
  • 基于票據(Stamp)的鎖機制
    • 支持三種模式:寫鎖、悲觀讀鎖、樂觀讀。
    • 樂觀讀不阻塞寫操作,通過驗證Stamp判斷數據一致性。
使用方法
StampedLock stampedLock = new StampedLock();// 樂觀讀
long stamp = stampedLock.tryOptimisticRead();
// 讀取數據
if (!stampedLock.validate(stamp)) {// 數據被修改,升級為悲觀讀鎖stamp = stampedLock.readLock();try { /* 重新讀取數據 */ } finally { stampedLock.unlockRead(stamp); }
}// 寫鎖
long stamp = stampedLock.writeLock();
try { /* 寫數據 */ } finally { stampedLock.unlockWrite(stamp); }
適用場景
  • 讀多寫少且容忍數據不一致:如統計、日志處理。
  • 極高性能需求:樂觀讀避免鎖競爭,但需處理驗證邏輯。

五、其他鎖機制

1. Condition 條件變量
  • ReentrantLock 配合使用,實現線程間協作(類似 wait/notify)。
  • 典型場景:生產者-消費者模型。
2. 分布式鎖
  • 如基于Redis的 Redisson 或ZooKeeper實現。
  • 適用場景:跨JVM或分布式系統同步。

六、鎖的選擇與性能優化

鎖對比表
鎖類型特性性能適用場景
synchronized自動釋放,非公平鎖低競爭時高效簡單同步需求
ReentrantLock可中斷、超時、公平鎖高競爭時高效復雜鎖需求
ReadWriteLock讀寫分離讀多寫少高效緩存、查詢系統
StampedLock樂觀讀,支持鎖升級極高并發讀多寫少,容忍數據不一致
最佳實踐
  1. 減少鎖粒度:縮小臨界區范圍。
  2. 避免嵌套鎖:防止死鎖(如按固定順序獲取鎖)。
  3. 監控鎖競爭:使用JProfiler或JStack分析鎖狀態。

七、總結

  • 簡單場景優先選擇 synchronized(JVM優化成熟)。
  • 復雜需求使用 ReentrantLockReadWriteLock
  • 極致性能考慮 StampedLock,但需謹慎處理數據一致性。

合理選擇鎖類型,結合性能測試和監控,是構建高效并發系統的關鍵。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77606.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77606.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77606.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

@JsonView + 單一 DTO:如何實現多場景 JSON 字段動態渲染

JsonView 單一 DTO:如何實現多場景 JSON 字段動態渲染 JsonView 單一 DTO:如何實現多場景 JSON 字段動態渲染1、JsonView 注解產生的背景2、為了滿足不同場景下返回對應的屬性的做法有哪些?2.1 最快速的實現則是針對不同場景新建不同的 DTO…

Etcd 壓縮整理

etcd數據存儲 在實際生產中使用 ETCD 存儲元數據,起初集群規模不大的時候元數據信息不多沒有發現什么問題。隨著集群規模越來越大,可能引發存儲問題。 —auto-compaction-retention 由于ETCD數據存儲多版本數據,隨著寫入的主鍵增加歷史版本需…

【更新完畢】2025媽媽杯C題 mathercup數學建模挑戰賽C題數學建模思路代碼文章教學:音頻文件的高質量讀寫與去噪優化

完整內容請看文章最下面的推廣群 我將先給出文章、代碼、結果的完整展示, 再給出四個問題詳細的模型 面向音頻質量優化與存儲效率提升的自適應編碼與去噪模型研究 摘 要 隨著數字媒體技術的迅速發展,音頻處理技術在信息時代的應用愈加廣泛,特別是在存儲…

React-請勿在循環或者條件語句中使用hooks

這是React Hooks的首要規則,這是因為React Hooks 是以單向循環鏈表的形式存儲,即是有序的。循環是為了從最后一個節點移到一個節點的時候,只需通過next一步就可以拿到第一個節點,而不需要一層層回溯。React Hooks的執行&#xff0…

【大模型】 LangChain框架 -LangChain實現問答系統

LangChain 介紹與使用方法 1. 什么是 LangChain?2. LangChain 的主要功能3. 如何使用 LangChain?3.1 環境準備3.2 基本使用示例3.2.1 簡單的問答系統3.2.2 結合外部工具 3.3 高級用法 4. 常見問題及解決方法4.1 安裝問題4.2 運行問題4.3 性能問題 5. 實戰…

企業級HAProxy高可用離線部署實戰(附Kubernetes APIServer負載均衡配置)

企業級HAProxy高可用離線部署實戰(附Kubernetes APIServer負載均衡配置) 摘要:本文深入講解在離線環境下部署HAProxy 3.1.1的全流程,涵蓋源碼編譯、系統服務封裝、K8S APIServer四層負載配置等核心環節,并提供生產級高…

Python網絡爬蟲設計(一)

目錄 一、網絡爬蟲 1、基本的爬蟲 2、獲取URL 3、查找網頁源碼關鍵字 4、代碼實現 二、requests庫 1、requests的優勢和劣勢 2、獲取網頁的其他庫 (1)selenium庫 (2)pyppeteer庫 三、pyppeteer庫 1、pyppeteer庫的來歷…

BR_頻譜20dB 帶寬(RF/TRM/CA/BV-05-C [TX Output Spectrum – 20 dB Bandwidth])

目錄 一、規范要求 1、協議章節 2、測試目的 二、測試方法 1、樣機初值條件: 2、測試步驟: 方法一:頻譜儀 方法二:綜測儀CMW500 3、預期結果 一、規范要求 1、協議章節 4.5.5 RF/TRM/CA/BV-05-C [TX Output Spectrum – 20 dB Ba…

【橘子大模型】初探rag知識庫的構建

一、簡介 我們在實現了一系列功能之后,終于來到了rag的部分,下面我們將基于langchain來實現一個rag檢索。 關于rag方面的知識,可以查看這兩篇文章: 大模型應用之RAG詳解 什么是 RAG(檢索增強生成) 或者是去…

CentOS7執行yum命令報錯 Could not retrieve mirrorlist http://mirrorlist.centos.org

CentOS7執行yum命令報錯 引更新yum源備份原有源創建新的源文件清理并重建緩存 引 CentOS 7 系統無法連接到 CentOS 的官方鏡像站點。這通常是由于網絡問題或 CentOS 7 已停止維護導致的(2024年6月30日后 CentOS 7 已進入 EOL) 報錯明細: 已…

VSCode安裝與環境配置(Mac環境)

20250419 - 概述 大概是非常久之前了,裝了VSCode,估計都得21的時候了,電腦上也沒更新過。當時安裝也直接裝上就完事了。這次把版本更新一下,同時記錄一下這個安裝過程。 安裝 mac下安裝非常簡單,直接從官網下載&am…

QML動畫--ParallelAnimation和SequentialAnimation

一、ParallelAnimation ParallelAnimation 是 QML 中用于并行執行多個動畫的容器動畫類型,可以同時運行多個子動畫。 基本用法 qml import QtQuick 2.15Rectangle {id: rectwidth: 100; height: 100color: "red"x: 0; y: 0; opacity: 1.0ParallelAnim…

NLP高頻面試題(四十三)——什么是人類偏好對齊中的「對齊稅」(Alignment Tax)?如何緩解?

一、什么是「對齊稅」(Alignment Tax)? 所謂「對齊稅」(Alignment Tax),指的是在使人工智能系統符合人類偏好的過程中,所不可避免付出的性能損失或代價。換句話說,當我們迫使AI遵循人類價值觀和規范時,AI系統往往無法達到其最大理論性能。這種性能上的妥協和折衷,就…

速查手冊:TA-Lib 超過150種量化技術指標計算全解 - 1. Overlap Studies(重疊指標)

速查手冊:TA-Lib 超過150種量化技術指標計算全解 - 1. Overlap Studies(重疊指標) TA-Lib(Technical Analysis Library)是廣泛使用的金融技術分析庫,實現了超過150種技術指標計算函數,適用于股票…

重構未來智能:Anthropic 解碼Agent設計哲學三重奏

第一章 智能體進化論:從工具到自主體的認知躍遷 1.1 LLM應用范式演進圖譜 階段技術形態應用特征代表場景初級階段單功能模型硬編碼規則執行文本摘要/分類進階階段工作流編排多模型協同調度跨語言翻譯流水線高級階段自主智能體動態決策交互編程調試/客服對話 1.1.…

Git 中修改某個特定的commit提交內容

在 Git 中修改某個特定的提交(commit)通常需要使用 交互式變基(Interactive Rebase) 或 修改提交(Commit Amend)。以下是不同場景下的具體操作步驟: 一、修改最近的提交(最新提交&am…

ZLMediaKit流媒體服務器

ZLMediaKit 簡介 ZLMediaKit 是一個基于 C11 開發的高性能流媒體服務器框架,支持 RTSP、RTMP、HLS、HTTP-FLV、WebSocket-FLV、HTTP-TS、WebSocket-TS、HTTP-fMP4、WebSocket-fMP4 等多種流媒體協議。 主要特性 多協議支持: 支持 RTSP/RTMP/HLS/HTTP-F…

數字電子技術基礎(五十)——硬件描述語言簡介

目錄 1 硬件描述語言簡介 1.1 硬件描述語言簡介 1.2 硬件編程語言的發展歷史 1.3 兩種硬件描述的比較 1.4 硬件描述語言的應用場景 1.5 基本程序結構 1.5.1 基本程序結構 1.5.2 基本語句和描述方法 1.5.3 仿真 1 硬件描述語言簡介 1.1 硬件描述語言簡介 硬件描述語…

SQL系列:常用函數

1、【MySQL】合并字段函數(列轉行) 它可以將兩個字段中的數據合并到一個字段中。 1)CONCAT函數 CONCAT函數可以將多個字段中的數據合并到一個字段中。它的語法格式如下: SELECT CONCAT(字段1,字段2,...字段N) FROM 表名;SELEC…

多線程和線程同步

多線程在項目開發中使用頻率高,使用多線程能夠提高程序的并發性 提高程序的并發性:1.多線程,對系統資源的消耗更小一些 2.多進程 系統的cpu資源有線,cpu時間片被分好后,由系統進行調度,每個線程在執行的時候都需要搶這個cpu的時間片。如果搶到了,就執行,如果沒搶到,…