SpringCloud 分布式鎖Redisson鎖的重入性與看門狗機制 高并發 可重入

可重入

Redisson 的鎖支持 可重入性,這意味著同一個線程在獲取鎖后,如果再次嘗試獲取該鎖,它可以成功地獲得鎖,而不會被阻塞。

  • 每次一個線程成功獲取鎖后,它的持有次數會增加。當線程再次獲取該鎖時,Redisson 會檢查該線程是否已經持有鎖。如果是,它會允許該線程再次獲取鎖,并將持有次數遞增。
  • 每次釋放鎖時,持有次數會遞減,直到持有次數變為零,鎖才會被完全釋放。

在這里插入圖片描述

  public static void main(String[] args) {// 創建 Redisson 客戶端配置Config config = new Config();config.useSingleServer().setAddress("redis://localhost:6379"); // 連接到本地 Redis 服務器RedissonClient redisson = Redisson.create(config);// 獲取分布式鎖RLock lock = redisson.getLock("accountLock");try {// 模擬賬戶操作的過程:先獲取鎖,進行第一次操作lock.lock();  //+1System.out.println("Lock acquired for the first time!");// 業務邏輯:扣款deductBalance(lock);} finally {// 釋放鎖:必須要釋放與 lock.lock() 相同次數的 unlock() 才能完全釋放鎖lock.unlock();  //-1System.out.println("Lock released after first operation.");}}// 模擬業務邏輯:扣款操作private static void deductBalance(RLock lock) {// 業務邏輯需要在同一個線程中再次獲取鎖(模擬可重入性)lock.lock();//+1try {System.out.println("Lock acquired for the second time, performing deduct balance operation...");// 扣款邏輯,比如賬戶余額減少System.out.println("Balance deducted!");} finally {// 釋放鎖lock.unlock();//-1System.out.println("Lock released after deduct balance operation.");}}

當value值為0時就會釋放鎖。
在這里插入圖片描述
這就是鎖的可重入性。


看門狗機制

看門狗機制用于確保分布式系統中,鎖或資源的持有者在預定時間內釋放鎖,否則看門狗會自動釋放該鎖,避免死鎖等問題。幫助避免因某些異常(如程序崩潰或線程掛起)而導致鎖被永久占用。

  • 自動續期:定期地自動刷新鎖的過期時間。當鎖被一個線程或進程持有時,會定期更新鎖的 TTL(過期時間),以防止它被過期。即使持鎖者在持有鎖的過程中沒有顯式地釋放鎖,會確保鎖不會在持有者不主動釋放時過期,從而避免因過期造成的錯誤。

  • 自動解鎖:如果持鎖者超時或出現故障,會在檢測到持鎖者沒有繼續更新鎖的超時時間后,自動釋放鎖,避免死鎖。

  • 配置超時時間:可以與鎖的過期時間和續期機制結合使用,可以通過配置來指定超時時間和自動續期的時間間隔。

在這里插入圖片描述

相關源代碼
嘗試獲取鎖,如果不能獲取鎖,一直等待直到獲取成功或者達到超時限制。中間部分涉及到鎖的租期和超時處理,保證鎖的可用性和避免死鎖。interruptibly 參數提供了是否支持中斷等待的選項。

private void lock(long leaseTime, TimeUnit unit, boolean interruptibly) throws InterruptedException {// 獲取當前線程的ID,用于標識是哪一個線程請求鎖long threadId = Thread.currentThread().getId();// 嘗試獲取鎖,并獲得鎖的剩余有效時間 ttlLong ttl = this.tryAcquire(-1L, leaseTime, unit, threadId);// 如果成功獲得鎖(ttl != null),則進入鎖處理邏輯if (ttl != null) {// 訂閱當前線程的鎖操作,返回一個 RFuture 對象,用于后續的異步操作RFuture<RedissonLockEntry> future = this.subscribe(threadId);// 根據 interruptibly 參數決定同步執行訂閱操作if (interruptibly) {// 如果需要響應中斷,使用帶中斷支持的同步方法this.commandExecutor.syncSubscriptionInterrupted(future);} else {// 如果不需要響應中斷,直接使用同步方法this.commandExecutor.syncSubscription(future);}try {// 啟動一個無限循環來持續嘗試獲取鎖while (true) {// 每次進入循環時,重新嘗試獲取鎖的剩余時間 ttlttl = this.tryAcquire(-1L, leaseTime, unit, threadId);// 如果 ttl 為 null,表示鎖已經過期或無法獲取,跳出循環if (ttl == null) {return;}// 如果 ttl >= 0L,表示可以繼續持有鎖if (ttl >= 0L) {try {// 嘗試在 ttl 指定的時間內獲取 latch((RedissonLockEntry) future.getNow()).getLatch().tryAcquire(ttl, TimeUnit.MILLISECONDS);} catch (InterruptedException var13) {// 如果在獲取 latch 時發生 InterruptedException,則根據 interruptibly 變量決定是否拋出異常if (interruptibly) {// 如果需要響應中斷,拋出 InterruptedExceptionthrow var13;}// 如果不需要響應中斷,嘗試繼續獲取 latch((RedissonLockEntry) future.getNow()).getLatch().tryAcquire(ttl, TimeUnit.MILLISECONDS);}} else if (interruptibly) {// 如果 ttl 為負值并且需要響應中斷,調用 acquire 方法阻塞直到獲取鎖((RedissonLockEntry) future.getNow()).getLatch().acquire();} else {// 如果 ttl 為負值并且不需要響應中斷,調用 acquireUninterruptibly 方法阻塞直到獲取鎖((RedissonLockEntry) future.getNow()).getLatch().acquireUninterruptibly();}}} finally {// 最終,取消訂閱,釋放資源this.unsubscribe(future, threadId);}}
}
  • 自動續期:通過 ttl 值和 latch.tryAcquire 方法,鎖的超時時間會在持有鎖的線程未釋放鎖的情況下自動延長,避免鎖超時。
  • 避免死鎖:如果線程因為異常等原因沒有釋放鎖,看門狗機制會確保鎖最終被釋放。

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

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

相關文章

Java 中 Redis 過期策略深度解析(含拓展-redis內存淘汰策略列舉)

&#x1f91f;致敬讀者 &#x1f7e9;感謝閱讀&#x1f7e6;笑口常開&#x1f7ea;生日快樂?早點睡覺 &#x1f4d8;博主相關 &#x1f7e7;博主信息&#x1f7e8;博客首頁&#x1f7eb;專欄推薦&#x1f7e5;活動信息 文章目錄 Java 中 Redis 過期策略深度解析一、Redis 過…

Flutter - 原生交互 - 相機Camera - 01

環境 Flutter 3.29 macOS Sequoia 15.4.1 Xcode 16.3 集成 Flutter提供了camera插件來拍照和錄視頻&#xff0c;它提供了一系列可用的相機&#xff0c;并使用特定的相機展示相機預覽、拍照、錄視頻。 添加依賴 camera: 提供使用設備相機模塊的工具path_provider: 尋找存儲圖…

基于 Amazon Q Developer CLI 和 Amazon Bedrock Knowledge Bases 實現智能問答系統

1. 引言 傳統企業通常將常見問題&#xff08;FAQ&#xff09;發布在網站上&#xff0c;方便客戶自助查找信息。然而&#xff0c;隨著生成式 AI 技術的迅速發展與商業滲透&#xff0c;這些企業正積極探索構建智能問答系統的新途徑。這類系統不僅能顯著提升客戶體驗&#xff0c;…

Go 為何天生適合云原生?

當前我們正處在 AI 時代&#xff0c;但是在基礎架構領域&#xff0c;仍然處在云原生時代。云原生仍然是當前時代的風口之一。作為一個 Go 開發者&#xff0c;職業進階的下一站就是學習云原生技術。作為 Go 開發者學習云原生技術有得天獨厚的優勢&#xff0c;這是因為 Go 天生適…

Mac查看MySQL版本的命令

通過 Homebrew 查看&#xff08;如果是用 Homebrew 安裝的&#xff09; brew info mysql 會顯示你安裝的版本、路徑等信息。 你的終端輸出顯示&#xff1a;你并沒有安裝 MySQL&#xff0c;只是查詢了 brew 中的 MySQL 安裝信息。我們一起來看下重點&#xff1a; &#x1f9fe…

Kafka ACK機制詳解:數據可靠性與性能的權衡之道

在分布式消息系統中&#xff0c;消息確認機制是保障數據可靠性的關鍵。Apache Kafka 通過 ACK&#xff08;Acknowledgment&#xff09;機制 實現了靈活的數據確認策略&#xff0c;允許用戶在 數據可靠性 和 系統性能 之間進行權衡。本文將深入解析 Kafka ACK 機制的工作原理、配…

FastMCP:構建 MCP 服務器和客戶端的高效 Python 框架

在人工智能領域&#xff0c;模型上下文協議&#xff08;Model Context Protocol&#xff0c;簡稱 MCP&#xff09;作為一種標準化的協議&#xff0c;為大型語言模型&#xff08;LLM&#xff09;提供了豐富的上下文和工具支持。而 FastMCP 作為構建 MCP 服務器和客戶端的 Python…

動態庫導出符號與extern “C“

1. windows下動態庫導出符號 根據C/C語法規則&#xff0c;函數聲明中的修飾符&#xff08;如__declspec(dllexport)&#xff09;可以放在返回類型之前或返回類型之后、函數名之前。這兩種方式在功能上是等價的&#xff0c;編譯器會以相同的方式處理。 __declspec(dllexport) …

Linux(9)——進程(控制篇——下)

目錄 三、進程等待 1&#xff09;進程等待的必要性 2&#xff09;獲取子進程的status 3&#xff09;進程的等待方法 wait方法 waitpid方法 多進程創建以及等待的代碼模型 非阻塞的輪訓檢測 四、進程程序替換 1&#xff09;替換原理 2&#xff09;替換函數 3&…

Datatable和實體集合互轉

1.使用已廢棄的 JavaScriptSerializer&#xff0c;且反序列化為弱類型 ArrayList。可用但不推薦。 using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; using System.Web; using Sy…

阿里云服務器ECS詳解:云服務器是什么,云服務器優勢和應用場景及參考

云服務器ECS是阿里云眾多云產品中&#xff0c;最受用戶關注的產品&#xff0c;阿里云服務器提供多樣化的計算能力&#xff0c;支持x86、Arm架構&#xff0c;涵蓋CPU、GPU等多種服務器類型&#xff0c;滿足各種用戶需求。其便捷易用特性包括分鐘級交付、通用API和性能監控框架&a…

【Oracle】游標

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;Oracle 文章目錄 1. 游標基礎概述1.1 游標的概念與作用1.2 游標的生命周期1.3 游標的分類 2. 顯式游標2.1 顯式游標的基本語法2.1.1 聲明游標2.1.2 帶參數的游標 2.2 游標的基本操作2.2.1 完整的游標操作示例 2.3 游標屬性2.3.1…

pikachu靶場通關筆記11 XSS關卡07-XSS之關鍵字過濾繞過(三種方法滲透)

目錄 一、源碼分析 1、進入靶場 2、代碼審計 3、攻擊思路 二、滲透實戰 1、探測過濾信息 2、注入Payload1 3、注入Payload2 4、注入Payload3 本系列為通過《pikachu靶場通關筆記》的XSS關卡(共10關&#xff09;滲透集合&#xff0c;通過對XSS關卡源碼的代碼審計找到安…

XML 元素:基礎、應用與優化

XML 元素:基礎、應用與優化 引言 XML(可擴展標記語言)作為一種數據交換的標準格式,廣泛應用于互聯網數據交換、數據存儲等領域。XML 元素是 XML 文檔的核心組成部分,本文將深入探討 XML 元素的概念、特性、應用以及優化方法。 一、XML 元素概述 1.1 XML 元素的定義 X…

【Axure高保真原型】交通事故大屏可視化分析案例

今天和大家分享交通事故大屏可視化分析案例的原型模板&#xff0c;包括餅圖分類分析、動態顯示發生數、柱狀圖趨勢分析、中部地圖展示最新事故發現地點和其他信息、右側列表記錄發生事故的信息…… 通過多種可視化圖表展示分析結果&#xff0c;具體效果可以點擊下方視頻觀看或…

HCIP(BGP基礎)

一、BGP 基礎概念 1. 網絡分類與協議定位 IGP&#xff08;內部網關協議&#xff09;&#xff1a;用于自治系統&#xff08;AS&#xff09;內部路由&#xff0c;如 RIP、OSPF、EIGRP&#xff0c;關注選路效率、收斂速度和資源占用。EGP&#xff08;外部網關協議&#xff09;&a…

【HarmonyOS 5】 ArkUI-X開發中的常見問題及解決方案

一、跨平臺編譯與適配問題 1. 平臺特定API不兼容 ?問題現象?&#xff1a;使用Router模塊的replaceUrl或startAbility等鴻蒙專屬API時&#xff0c;編譯跨平臺工程報錯cant support crossplatform application。 ?解決方案?&#xff1a; 改用ohos.router的跨平臺封裝API&a…

Matlab2018a---安裝教程

目錄 壹 | 引 言 貳 | 安裝環境 叁 | 安 裝 肆 | 結 語 壹 | 引 言 大家好&#xff0c;我是子正。 最近想學習一下DSP數字信號處理有關的知識&#xff0c;要用到Matlab進行數據處理&#xff0c;于是又重新把Matlab撿了回來; 記得上學那會兒用的還是Matlab2012a&#xff…

分布式流處理與消息傳遞——Kafka ISR(In-Sync Replicas)算法深度解析

Java Kafka ISR&#xff08;In-Sync Replicas&#xff09;算法深度解析 一、ISR核心原理 #mermaid-svg-OQtnaUGNQ9PMgbW0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-OQtnaUGNQ9PMgbW0 .error-icon{fill:#55222…

ARM GIC V3概述

中斷類型 locality- specific peripheral interrupt&#xff08;LPI&#xff09;&#xff1a;LPI是一個有針對性的外設中斷&#xff0c;通過affinity路由到特定的PE。 為非安全group1中斷邊沿觸發可以通過its進行路由沒有active狀態&#xff0c;所以不需要明確的停用操作LPI總…