ReentrantLock和RLock

文章目錄

  • 前言
  • 一、 ReentrantLock(單機鎖,Java 內置)
    • 示例:
    • 方法詳解
  • 二、RLock(分布式鎖,Redisson 提供)
    • 示例:
    • 方法詳解
  • 三、 對比總結:
  • 四、 如何選擇?


前言

ReentrantLock 和 RLock 都是可重入鎖(Reentrant Lock),但它們屬于不同的鎖實現,分別適用于 單機環境 和 分布式環境。

一、 ReentrantLock(單機鎖,Java 內置)

ReentrantLock 是 Java 標準庫(java.util.concurrent.locks)提供的可重入互斥鎖,適用于 單機多線程 場景。特點可重入性:同一個線程可以多次獲取同一把鎖(避免死鎖)。公平/非公平鎖:支持公平鎖(按等待順序獲取)和非公平鎖(默認,允許插隊)。可中斷:lockInterruptibly() 允許線程在等待鎖時響應中斷。條件變量:支持 Condition,用于線程間協調(如 await() / signal())。必須手動釋放:必須調用 unlock(),否則可能導致死鎖。

示例:

ReentrantLock lock = new ReentrantLock();
try {if (lock.tryLock(1, TimeUnit.SECONDS)) { // 嘗試獲取鎖,最多等1秒try {System.out.println("Lock acquired!");} finally {lock.unlock(); // 必須手動釋放}}
} catch (InterruptedException e) {Thread.currentThread().interrupt();
}

方法詳解

方法說明
lock()阻塞獲取鎖,如果鎖被占用,當前線程會一直等待。
lockInterruptibly()可中斷地獲取鎖,等待過程中可響應 InterruptedException。
tryLock()嘗試非阻塞獲取鎖,成功返回 true,失敗返回 false。
tryLock(long timeout, TimeUnit unit)在指定時間內嘗試獲取鎖,超時返回 false。
unlock()釋放鎖(必須在 finally 塊中調用,避免死鎖)。
isLocked()判斷鎖是否被占用(非標準方法,需自定義實現)。
isHeldByCurrentThread()判斷當前線程是否持有鎖。
getHoldCount()返回當前線程持有鎖的次數(可重入計數)。
getQueueLength()返回等待獲取鎖的線程數(監控用)。
hasQueuedThreads()是否有線程在等待鎖。
newCondition()返回 Condition 對象,用于線程間協調(類似 wait/notify)。

二、RLock(分布式鎖,Redisson 提供)

RLock 是 Redisson(Redis 客戶端)提供的 分布式可重入鎖,適用于 多機多進程 環境,基于 Redis 實現。特點可重入性:同 ReentrantLock,支持同一個客戶端多次加鎖。自動釋放(Lease Time):可以設置鎖的自動過期時間(防止死鎖)。看門狗機制(Watchdog):如果未指定 leaseTime,Redisson 會啟動一個后臺線程(看門狗)自動續期鎖,避免業務未執行完鎖就過期。支持高可用:如果 Redis 是集群模式,RLock 仍然可用(Redisson 有 RedLock 算法)。支持異步鎖:提供 lockAsync() 等異步方法。

示例:

RLock lock = redisson.getLock("myLock");
try {// 嘗試獲取鎖,最多等10秒,鎖自動30秒后釋放if (lock.tryLock(10, 30, TimeUnit.SECONDS)) {try {System.out.println("Lock acquired!");// 業務邏輯...} finally {lock.unlock(); // 建議手動釋放(即使設置了leaseTime)}}
} catch (InterruptedException e) {Thread.currentThread().interrupt();
}

方法詳解

方法說明
lock()阻塞獲取鎖,默認 看門狗自動續期(防止死鎖)。
lock(long leaseTime, TimeUnit unit)獲取鎖并設置自動釋放時間(leaseTime 后自動釋放)。
lockInterruptibly()可中斷獲取鎖(支持線程中斷)。
tryLock()嘗試獲取鎖,成功返回 true,失敗返回 false。
tryLock(long waitTime, long leaseTime, TimeUnit unit)在 waitTime 內嘗試獲取鎖,成功后鎖在 leaseTime 后自動釋放。
unlock()釋放鎖(建議在 finally 中調用)。
forceUnlock()強制釋放鎖(即使當前線程未持有)。
isLocked()判斷鎖是否被占用。
isHeldByCurrentThread()當前線程是否持有鎖。
remainTimeToLive()返回鎖的剩余存活時間(TTL)。

三、 對比總結:

在這里插入圖片描述

四、 如何選擇?

單機應用 ? ReentrantLock(更輕量,無網絡開銷)。
分布式系統 ? RLock(基于 Redis,適用于多服務競爭鎖)。
需要自動釋放 ? RLock(設置 leaseTime 防止死鎖)。
需要條件變量 ? ReentrantLock(Condition 更靈活)。
如果你的應用是 微服務/分布式架構,RLock 是更好的選擇;如果是 單機高并發,ReentrantLock 更高效。

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

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

相關文章

thinkphp ThinkPHP3.2.3完全開發手冊

慣例配置 應用設定 APP_USE_NAMESPACE > true, // 應用類庫是否使用命名空間 3.2.1新增 APP_SUB_DOMAIN_DEPLOY > false, // 是否開啟子域名部署 APP_SUB_DOMAIN_RULES > array(), // 子域名部署規則 APP_DOMAIN_SUFFIX > , // 域名后綴 如果是…

Python Day50 學習(仍為日志Day19的內容復習)

補充:梳理超參數調整流程(邏輯) 超參數調節的流程邏輯可以總結為以下幾個步驟: 1. 明確目標 確定你要優化的模型和評估指標(如準確率、F1值、AUC等)。 2. 選擇要調節的超參數 列出模型中影響較大的超參數…

公司網絡變差的解決方法(固定IP地址沖突)

問題描述 最近公司網絡變差,不知道為什么。(別的同事反饋的,本人沒有感覺變差,也是比較奇怪的現象) 現象有視頻會議變卡等。 調查過程 1.領導給網絡公司打電話溝通,對面遠程看了下,不是設備問…

使用Prometheus+Grafana+Alertmanager+Webhook-dingtalk搭建監控平臺

一、監控平臺介紹 1.監控平臺簡述普羅米修斯四件套,分別為Prometheus、Grafana、Alertmanager、Webhook-DingTalk。Prometheus一套開源的監控&報警&時間序列數據庫的組合,由SoundCloud公司開發,廣泛用于云原生環境和容器化應用的監控和性能分析。其提供了通用的數據…

UR機器人解鎖關節扭矩控制:利用英偉達Isaac Lab框架,推動裝配自動化的Sim2Real遷移

在工業制造領域,機器人裝配長期依賴固定自動化模式,面臨部署成本高、適配性差等挑戰。多部件裝配是制造業、汽車及航空航天等行業中的核心環節。傳統裝配系統通常針對特定任務設計,依賴大量人工工程部署,靈活性不足,難…

ABB 605系列

系列概述 ABB Relion605系列是專為配電網設計的保護繼電器產品系列,代表了中低壓電力系統保護領域的技術基準。基于ABB在電力保護領域數十年的經驗,該系列集成了最新的數字信號處理技術和網絡通信能力,為變電站自動化提供了完整的解決方案。…

Python|GIF 解析與構建(6):手搓 tk 錄制工具

目錄 Python|GIF 解析與構建(6):手搓 tk 錄制工具 一、工具功能概覽 二、核心架構設計 1. 幀率控制模塊 2. 屏幕捕獲模塊 3. 主應用模塊 三、關鍵技術解析 1. 屏幕捕獲技術 2. 幀率控制原理 3. 透明窗口實現 四、使用指…

在VBA中,提取word表格的文本時,通常有什么干擾符號,需要清除

標題 在VBA中,提取word表格的文本時,通常有什么干擾符號,需要清除 正文 解決問題提取word表格的文本時,通常有什么干擾符號,需要清除 在VBA中提取Word表格文本時,常見的干擾符號及其清除方法如下: ?? 一、主要干擾符…

C++基礎學習:深入理解類中的構造函數、析構函數、this指針與new關鍵字

前言 在C面向對象編程中,類是構建復雜程序的基本單元。今天,我們將深入探討類中的幾個核心概念:構造函數、析構函數、this指針以及new關鍵字。這些概念對于理解C對象生命周期和內存管理至關重要。 1. 構造函數 構造函數是類的一個特殊成員…

2025 高考游記/總結

坐標GD 新課標一卷選手 前言 思緒有點亂,想想從哪里說起 沒想到這個博客已經三年沒發過東西了,上次發還是初三準備特長生的時候,一瞬間就已經高考結束了,有種不真實感 對于高中的三年,有很多話、很多感悟想說&#xff…

Python基礎之函數(1/3)

函數(基礎) [函數后續還會更新兩次] 一.認識函數的作用 函數就是將一段具有獨立功能的代碼塊整合到一個整體并命名,在需要的位置,調用這個名稱即可完成對應的需求 函數在開發過程中,可以更高效的實現代碼重用 二.函數的使用步驟 1定義函…

AWS CloudFormation實戰:構建可復用的ECS服務部署模板

一、前言 在云原生時代,基礎設施即代碼(IaC)已成為DevOps實踐的核心組件。AWS CloudFormation作為AWS原生的IaC服務,允許開發人員和系統管理員以聲明式方式定義和部署AWS資源。本文將深入探討如何構建一個通用的CloudFormation模板,用于在AWS ECS(Elastic Container Servic…

GRUB2 啟動配置的工作原理與優先級規則詳解

一、核心組件概述 /boot/loader/entries/ 類型:目錄,存儲 BLS (Boot Loader Specification) 格式的啟動項配置文件(如 20-custom-kernel-5.14.0.conf)。管理工具:由 grubby、kernel-install 等工具自動生成或修改。配置內容:每個文件定義一個啟動項的詳細參數(內核路徑、…

網頁版便簽應用開發:HTML5本地存儲與拖拽交互實踐

文章目錄 摘要成品顯示核心功能與實現語法1. 本地存儲管理2. 拖拽功能實現3. 自動保存機制4. 時間格式化處理 完整代碼 摘要 本文詳細介紹了一個基于HTML5的便簽應用開發過程,重點講解了如何利用localStorage實現數據持久化存儲,以及如何實現流暢的拖拽…

docker compose安裝Prometheus、Grafana

1、創建目錄結構 mkdir -p /opt/monitoring/{prometheus,grafana} mkdir -p /opt/monitoring/prometheus/{config,data} chmod -R 777 /opt/monitoring # 確保容器有寫入權限 2、準備 Prometheus 配置文件 vi /opt/monitoring/prometheus/config/prometheus.yml global:sc…

稀土化合物在生態環境的應用

稀土化合物憑借強吸附性、催化活性及環境兼容性,已成為生態治理的關鍵材料。氧化物、氯化物、磷酸鹽等基礎產品,通過靈活復配與工藝適配,可高效解決水體凈化、土壤修復、廢氣處理三大核心問題,推動環境治理向低耗高效轉型。那么&a…

搭建網站應該怎樣選擇服務器?

互聯網技術已經全面在各個地區進行發展,越來越多的企業選擇線上業務,搭建屬于自己的網站運營,以此來增加品牌的知名度并進行詳細介紹,但是企業在進行搭建網站的前提,要選擇一種合適的服務器,確保后續網站能…

每日算法刷題Day30 6.13:leetcode二分答案2道題,用時1h10min

5. 1201.丑數III(中等) 1201. 丑數 III - 力扣(LeetCode) 思想 1.丑數是可以被 a 或 b 或 c 整除的 正整數 。 給你四個整數:n 、a 、b 、c ,請你設計一個算法來找出第 n 個丑數。 2.此題是4. 878.第N個神奇數字的進階版&#…

Appium+python自動化(二十一)- Monkey指令操作手機

第一式 - 隱藏命令 monkey隱藏的兩個命令&#xff1a; –pck-blacklist-file<黑名單文件><br><br>–pck-whitelist-file<白名單文件> monkey還有一個隱藏的命令那就是&#xff1a; –f<腳本文件>:可以指定monkey的自定義腳本 一般monkey測試…

微信小程序動態效果實戰指南:從懸浮云朵到絲滑列表加載

小紅書爆款交互設計解析&#xff0c;附完整代碼&#xff01; &#x1f525; 一、為什么動態效果是小程序的關鍵競爭力&#xff1f; 用戶留存提升&#xff1a;數據顯示&#xff0c;86.3%的微商從業者依賴微信小程序&#xff0c;而動態效果能顯著降低跳出率。技術賦能體驗&#…