ReentrantLock 用法與源碼剖析筆記

📒 ReentrantLock 用法與源碼剖析筆記


🚀 一、ReentrantLock 核心特性
  • 🔄 可重入性:同一線程可重復獲取鎖(最大遞歸次數為 Integer.MAX_VALUE
  • 🔧 公平性:支持公平鎖(按等待順序獲取)和非公平鎖(默認,允許插隊)
  • ? 超時機制tryLock(long timeout, TimeUnit unit)
  • 🚫 可中斷lockInterruptibly() 允許響應中斷
  • 🔗 條件變量Condition 實現精準線程喚醒(對比 Object.wait/notify

🛠? 二、基礎用法模板
ReentrantLock lock = new ReentrantLock();
// 非公平鎖(默認) vs 公平鎖(new ReentrantLock(true))lock.lock();  // 📌 阻塞獲取鎖
try {// 臨界區代碼
} finally {lock.unlock();  // ?? 必須放在 finally 塊!
}// 高級用法示例
if (lock.tryLock(1, TimeUnit.SECONDS)) {  // ? 帶超時嘗試try {// ...} finally {lock.unlock();}
}

🔍 三、源碼架構分析

image-20250225234605218

  1. Sync 同步器(繼承 AQS)

    • NonfairSync(非公平鎖實現)
    • FairSync(公平鎖實現)
  2. AQS 核心機制

    • state 字段:鎖狀態計數器(0=未鎖定,>0=鎖定次數)
    • CLH 隊列:線程等待隊列(雙向鏈表實現)

?? 四、關鍵方法源碼解析
🔑 1. lock() 方法對比
// 非公平鎖實現
final void lock() {if (compareAndSetState(0, 1))  // 🚀 直接嘗試插隊setExclusiveOwnerThread(Thread.currentThread());elseacquire(1);
}// 公平鎖實現
final void lock() {acquire(1);  // ?? 必須排隊
}// AQS 核心方法
public final void acquire(int arg) {if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCLUSIVE), arg))selfInterrupt();
}
🔄 2. tryAcquire 差異
// 非公平鎖 tryAcquire
protected final boolean tryAcquire(int acquires) {return nonfairTryAcquire(acquires);  // 🎲 允許插隊
}// 公平鎖 tryAcquire
protected final boolean tryAcquire(int acquires) {if (getQueueLength() > 0 && getExclusiveOwnerThread() != Thread.currentThread()) {return false;  // 🚧 隊列有等待線程時禁止獲取}// ...后續與非公平鎖相同
}

💡 五、設計亮點與注意事項
  • 性能取舍:非公平鎖吞吐量更高(減少線程切換),但可能產生線程饑餓
  • 鎖釋放必須:unlock() 必須執行(建議用 try-finally 包裹)
  • 🧵 Condition 高級用法:實現多條件等待(典型應用:生產者-消費者模型)
  • ?? 避免死鎖:加鎖順序要一致,超時機制可作為兜底

📊 六、與 synchronized 對比
特性ReentrantLocksynchronized
實現機制API 層面JVM 內置
鎖釋放必須顯式 unlock()自動釋放
公平性可配置非公平
中斷響應支持不支持
條件變量多 Condition單 Object monitor
性能高競爭時更優優化后差距縮小

🌟 七、最佳實踐建議
  • 🆚 優先選擇:需要高級功能時用 ReentrantLock,簡單場景用 synchronized
  • 🧪 鎖測試:用 ThreadMXBean 檢測死鎖
  • 📏 鎖粒度:盡量縮小鎖作用域
  • 🧮 性能監控:關注 getQueueLength() 等統計方法

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

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

相關文章

基于GO語言的車牌識別api技術-港澳車牌文字識別

隨著科技的飛速發展,智能化管理逐漸滲透到我們生活的方方面面。車牌識別技術作為智能交通的重要組成部分,不僅極大提升了交通管理的效率,還為市民出行帶來了更多便利。而港澳地區的車牌識別技術,憑借其高效、精準、快速的特點&…

基于 DeepSeek LLM 本地知識庫搭建開源方案(AnythingLLM、Cherry、Ragflow、Dify)認知

寫在前面 博文內容涉及 基于 Deepseek LLM 的本地知識庫搭建使用 ollama 部署 Deepseek-R1 LLM知識庫能力通過 Ragflow、Dify 、AnythingLLM、Cherry 提供理解不足小伙伴幫忙指正 😃,生活加油 我站在人潮中央,思考這日日重復的生活。我突然想&#xff0c…

PCB設計常用布局布線方法

PCB設計常用布局布線方法 **1.模塊化布局,**先放大器件再放小器件。 立創在原理圖框完后,在PCB快捷shiftp 2.布局對齊美觀 3.重要信號線優先處理 分類再畫 4.減少Stub布線:就是避免為連接的線段,防止產生“天線效應”&#xff…

Mac 版 本地部署deepseek ? RAGflow 知識庫搭建流程分享(附問題解決方法)

安裝: 1、首先按照此視頻的流程一步一步進行安裝:(macos版)ragflowdeepseek 私域知識庫搭建流程分享_嗶哩嗶哩_bilibili 2、RAGflow 官網文檔指南:https://ragflow.io 3、RAGflow 下載地址:https://github.com/infi…

娛閑放鬆篇2

最近看了好多動畫和以前的新聞,都挺有想法,可以了解一下 有些是N年前的,希望見怪莫怪 若說如何用最小作用量去理解世界觀的話,其實就是書,以動畫的角度來看,日本動畫足以 一.高達系列 一系列的利用巨大…

OpenIPC開源FPV之Adaptive-Link安裝

OpenIPC開源FPV之Adaptive-Link安裝 1. 源由2. 介紹2.1 天空端安裝2.2 地面端安裝 3. 問題匯總3.1 安裝腳本問題3.2 網絡安裝問題3.3 非SSC30KQ/SSC338Q硬件3.4 代碼疑問 4. 總結5. 后續 1. 源由 鑒于飛行過程,發現一些馬賽克現象,且60FPS桌面30FPS的錄…

解析第十一頁

多選707、如圖所示組網,SWA、SWB、SWC、SWD運行RSTP,則以下說法正確的是? A、可以在SWB的GE0/0/2端口開啟邊緣端口,讓連接終端的接口快速進入轉發狀態 B、邊緣端口收到BPDU之后會重新參與生成樹的計算 C、可以在SWC的GEO/0/2端口開啟邊緣端口,讓連接終端的接口快速進入轉…

禾邁電力電子嵌入式面經和參考答案

CMakeLists 怎么寫? CMakeLists.txt 是 CMake 構建系統的配置文件,用于描述項目的構建規則和依賴關系。以下是一個簡單的 CMakeLists.txt 示例及基本寫法說明。 首先,指定 CMake 的最低版本要求,例如cmake_minimum_required(VERSION 3.10)。 然后,定義項目名稱,如project…

我的AI工具箱Tauri版-FluxCharacterGeneration參考圖像生成人像手辦(Flux 版)

本教程基于自研的AI工具箱Tauri版進行ComfyUI工作流FluxCharacterGeneration參考圖像生成人像手辦(Flux 版)。 我的AI工具箱Tauri版 - FluxCharacterGeneration參考圖像生成人像手辦(Flux版) 基于先進的FLUX模型,通過…

什么是DrawCall?DrawCall為什么會影響游戲運行效率?如何減少DrawCall?

目錄 1 什么是DrawCall? 2 DrawCall為什么會影響游戲運行效率? 3 如何減少 DrawCall?(結合性能分析工具) 1 什么是DrawCall? DrawCall(繪制調用) 是 GPU 的一個指令&#xff0c…

深入解析提示詞:從基礎到結構化應用

在人工智能蓬勃發展的當下,提示詞(Prompt)扮演著至關重要的角色。無論是在與聊天機器人交流,還是驅動復雜智能體完成任務,精準且高效的提示詞都能起到事半功倍的效果。本文將帶你全面了解提示詞,深入探索結…

【前端基礎】Day 2 HTML

目錄 1.表格標簽 2.列表標簽 3.表單標簽 4.綜合案例 5.查閱文檔 1.表格標簽 <body><table align"center" border"1" cellpadding"0" cellspacing"0" width"500" height"100"><thead> …

R與RStudio簡介及安裝

目錄 一、R與RStudio關系 二、R簡介 2.1. 發展歷史 2.2. R語言特點 三、安裝指南 3.1 R安裝指南 3.2 R studio安裝指南 一、R與RStudio關系 R是統計領域廣泛使用的工具&#xff0c;屬于GNU系統的一個自由、免費、源代碼開放的軟件&#xff0c;是 用于統計計算和統計繪圖…

20分鐘 Bash 上手指南

文章目錄 bash 概念與學習目的第一個 bash 腳本bash 語法變量的使用位置參數管道符號&#xff08;過濾條件&#xff09;重定向符號條件測試命令條件語句case 條件分支Arrayfor 循環函數exit 關鍵字 bash 腳本記錄歷史命令查詢文件分發內容 bash 概念與學習目的 bash&#xff0…

django校園互助平臺~源碼

博主介紹&#xff1a;?程序猿徐師兄、8年大廠程序員經歷。全網粉絲15w、csdn博客專家、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域和畢業項目實戰? &#x1f345;文末獲取源碼聯系&#x1f345; &#x1f447;&#x1f3fb; 精彩專欄推薦訂閱&#x1f447;…

易基因:RNA甲基化修飾和R-loop的交叉調控:從分子機制到臨床意義|深度綜述

大家好&#xff0c;這里是專注表觀組學十余年&#xff0c;領跑多組學科研服務的易基因。 R-loop&#xff08;RNA-DNA雜合結構&#xff09;是轉錄調控、DNA復制和修復等關鍵細胞過程的重要組成部分。但R-loop異常積累可能會破壞基因組完整性&#xff0c;從而導致多種疾病的發生…

多智能體框架

多個不同的角色的Agent&#xff0c;共同完成一份復雜的工作。由一個統籌管理的智能體&#xff0c;自主規劃多個智能體分別做什么&#xff0c;以及執行的順序。 agent 應該包含的屬性 執行特定任務 根據其角色和目標做出決策 能夠使用工具來實現目標 與其他代理溝通和協作 保留…

wifi5和wifi6,WiFi 2.4G、5G,五類網線和六類網線,4G和5G的區別

wifi5和wifi6的區別 是Wi-Fi 5和Wi-Fi 6的選擇與路由器密切相關。路由器是創建和管理無線網絡的設備,它決定了網絡的類型和性能。具體來說: 路由器的標準支持:路由器可以支持不同的Wi-Fi標準,如Wi-Fi 5(802.11ac)和Wi-Fi 6(802.11ax)。支持Wi-Fi 6的路由器能夠提供更高…

Metal 學習筆記四:頂點函數

到目前為止&#xff0c;您已經完成了 3D 模型和圖形管道。現在&#xff0c;是時候看看 Metal 中兩個可編程階段中的第一個階段&#xff0c;即頂點階段&#xff0c;更具體地說&#xff0c;是頂點函數。 著色器函數 定義著色器函數時&#xff0c;可以為其指定一個屬性。您將在本…

什么是零拷貝?

零拷貝是一種優化技術&#xff0c;用于減少數據在計算機系統中的拷貝次數&#xff0c;從而提高性能和效率。在傳統的數據傳輸中&#xff0c;數據通常會在多個緩沖區之間進行多次拷貝&#xff0c;而零拷貝技術通過減少這些不必要的拷貝操作&#xff0c;顯著降低了CPU和內存的開銷…