淺析鎖的應用與場景

鎖的應用與場景:從單機到分布式

摘要:在多線程和分布式系統中,“鎖”是避免資源競爭、保障數據一致性的核心機制。但你真的了解鎖嗎?什么時候該用鎖?用哪種鎖?本文通過通俗的比喻和代碼示例,帶你徹底搞懂鎖的應用場景!


一、為什么需要鎖?

想象一下:多人同時編輯同一份文檔,如果不加控制,最終文檔內容會亂成一鍋粥。程序中的共享資源(如數據庫字段、文件、內存變量)同樣面臨這個問題——鎖的作用就是讓多個線程/進程“排隊”訪問資源

常見問題場景:

  1. 訂單重復處理:用戶瘋狂點擊提交訂單,導致重復扣款。
  2. 超賣問題:秒殺活動中庫存被減到負數。
  3. 數據覆蓋:兩個線程同時修改用戶余額,后者覆蓋前者結果。

二、單機環境下的鎖

1. 樂觀鎖 vs 悲觀鎖

  • 悲觀鎖:假設一定會發生沖突,先加鎖再操作。
    • 應用場景:沖突頻繁、臨界區代碼執行時間長。

    • 實現方式

      • 數據庫:SELECT ... FOR UPDATE
      • Java:synchronizedReentrantLock
維度synchronizedReentrantLock
鎖管理JVM 自動管理,無需手動釋放需手動獲取和釋放,易忘記導致死鎖
靈活性功能簡單,僅支持非公平鎖支持公平鎖、超時、中斷、多條件變量
性能JVM 優化后性能接近(低競爭場景更優)高并發場景更靈活(如 tryLock 減少競爭)
調試支持鎖信息不易獲取(如等待隊列長度)提供 isLocked(), getQueueLength() 等方法
適用場景簡單同步需求(如單方法內的線程安全)復雜同步邏輯(如多條件協調、精細控制)
  • 樂觀鎖:假設沖突很少,先操作再檢查是否沖突。
    • 應用場景:讀多寫少、沖突概率低。
    • 實現方式
      • 數據庫:版本號(Version字段)+ CAS更新
      • Java:AtomicIntegerStampedLock
代碼示例:數據庫樂觀鎖
-- 1. 查詢時獲取版本號
SELECT stock, version FROM product WHERE id = 1;-- 2. 更新時校驗版本號
UPDATE product SET stock = stock - 1, version = version + 1 
WHERE id = 1 AND version = 1; -- 如果version被修改過,更新失敗

2. 讀寫鎖(ReadWriteLock)

  • 核心思想:讀操作不互斥,寫操作互斥。
  • 應用場景:讀多寫少,如緩存系統。
  • Java實現ReentrantReadWriteLock
ReadWriteLock rwLock = new ReentrantReadWriteLock();// 讀操作
rwLock.readLock().lock();
try {// 讀取數據(允許多個線程同時讀)
} finally {rwLock.readLock().unlock();
}// 寫操作
rwLock.writeLock().lock();
try {// 修改數據(獨占鎖)
} finally {rwLock.writeLock().unlock();
}

三、分布式鎖

當服務部署在多臺機器上時(即使在同一臺物理機上的多個容器/Pod),單機鎖失效,必須使用分布式鎖協調跨進程的資源訪問。

1. 常見實現方案

方案核心原理優點缺點
Redis鎖SETNX + 過期時間 + Lua腳本刪除性能高,實現簡單存在鎖過期提前釋放風險
ZooKeeper創建臨時順序節點,監聽前序節點刪除可靠性高,自動釋放鎖性能較低,需要維護ZK集群
數據庫鎖基于唯一索引或行級鎖無需額外組件性能差,高并發易成瓶頸
  • 高并發且允許偶發鎖失效:Redis + Redisson。
  • 強一致性需求:ZooKeeper 或 Etcd。
  • 簡單場景:數據庫(不推薦生產環境高頻使用)

2. Redis分布式鎖示例(Redisson實現)

// 1. 獲取鎖對象
RLock lock = redissonClient.getLock("orderLock");// 2. 嘗試加鎖(等待10秒,鎖自動釋放時間30秒)
boolean isLocked = lock.tryLock(10, 30, TimeUnit.SECONDS);
if (isLocked) {try {// 處理業務邏輯processOrder();} finally {lock.unlock();}
}

四、如何選擇合適的鎖?

1. 決策流程圖

在這里插入圖片描述

2. 黃金原則

  • 能用單機鎖就別用分布式鎖(復雜度陡增)
  • 鎖粒度要小:鎖住的范圍越小,性能越高
  • 優先考慮無鎖設計:如使用線程安全的類(ConcurrentHashMap)、本地線程存儲(ThreadLocal

五、避坑指南

  1. 死鎖:避免嵌套鎖,設置超時時間。
  2. 鎖饑餓:公平鎖可緩解,但性能會下降。
  3. 鎖泄露:確保finally塊中釋放鎖。
  4. 腦裂問題(分布式鎖):選擇強一致性協調器(如ZooKeeper)。

六、總結

  • 單機多線程:本地鎖 + 數據庫唯一索引即可滿足需求,無需分布式鎖。優先選synchronizedReentrantLock
  • 多機/多實例:必須引入分布式鎖,同時結合數據庫約束保證最終安全。
  • 高并發讀:讀寫鎖(ReadWriteLock)是救星。
  • 分布式系統:Redis鎖(性能)或ZooKeeper鎖(可靠性)二選一。
  • 終極目標:在安全性和性能之間找到平衡!

技術沒有銀彈,理解場景才能選出最合適的鎖!

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

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

相關文章

30天通過軟考高項-第三天

30天通過軟考高項-第三天 任務:項目范圍管理 思維導圖閱讀 知識點集錦閱讀 知識點記憶 章節習題練習 知識點練習 手寫回憶ITTO 聽一遍喜馬拉雅關于范圍的內容 范圍管理-背 1. 過程定義 規劃變瘦訂份缺孔 規劃范圍管理:為了記錄如何定…

文字過長使用省略號展示,text-overflow 的使用和不生效場景的解決辦法,flex 布局中文字省略展示的坑

在前端開發過程中【單行文本內容過長使用省略號展示】這是一個特別常見的功能,大家都知道要使用 text-overflow 這個 css 屬性。 關于這個屬性,我們可以先看一下官方文檔怎么說。 text-overflow CSS 屬性用于確定如何提示用戶存在隱藏的溢出內容。其形式…

(二)讀寫分離架構、冷熱分離架構

文章目錄 讀寫分離架構什么是讀寫分離結構架構模型優缺點優點缺點 技術案例寫情況讀情況 冷熱分離架構什么是冷熱分離架構?架構模型優缺點優點 缺點技術案例讀數據寫數據 讀寫分離架構 什么是讀寫分離結構 讀寫分離架構針對于數據庫。數據庫原本負責讀寫兩個功能。 讀寫分離架…

windows中kafka4.0集群搭建

參考文獻 Apache Kafka windows啟動kafka4.0(不再需要zookeeper)_kafka壓縮包-CSDN博客 Kafka 4.0 KRaft集群部署_kafka4.0集群部署-CSDN博客 正文 注意jdk需要17版本以上的 修改D:\software\kafka_2.13-4.0.0\node1\config\server.properties配置文…

無線通信網

注意區分CA(無線)和CD(有線) 無線局域網擴頻技術 FHSS/DSSS 無線頻譜和信道:2.4G/5GHz,2.4GHz共13個信道,3個不重疊信道 CSMA/CA,隱藏節點 MANET 無線安全:WEP、WPA、WPA2、AES/TP…

嵌入式開發:基礎知識介紹

一、嵌入式系統 1、介紹 以提高對象體系智能性、控制力和人機交互能力為目的,通過相互作用和內在指標評價的,嵌入到對象體系中的專用計算機系統。 2、分類 按其形態的差異,一般可將嵌入式系統分為:芯片級(MCU、SoC&am…

uv包管理器如何安裝依賴?

uv包管理器如何安裝依賴? 輸入 uv pip install 包名 uv pip install python-docx

大模型驅動智能服務變革:從全流程賦能到行業縱深落地

大模型技術的快速發展,正深刻改變著人工智能的研發與應用模式。作為"軟硬協同、開箱即用"的智能化基礎設施,大模型一體機通過整合計算硬件、部署平臺和預置模型,重構了傳統AI部署方式,成為推動AI普惠化和行業落地的重要…

【MQ篇】RabbitMQ之簡單模式!

目錄 引言一、 初識 RabbitMQ 與工作模式二、 簡單模式 (Simple Queue) 詳解:最直接的“點對點快遞” 📮三、 Java (Spring Boot) 代碼實戰:讓小兔子跑起來! 🐰🏃?♂?四、 深入理解:簡單模式的…

Lua 第7部分 輸入輸出

由于 Lua 語言強調可移植性和嵌入性 , 所以 Lua 語言本身并沒有提供太多與外部交互的機制 。 在真實的 Lua 程序中,從圖形、數據庫到網絡的訪問等大多數 I/O 操作,要么由宿主程序實現,要么通過不包括在發行版中的外部庫實現。 單就…

【開源】STM32HAL庫移植Arduino OneWire庫驅動DS18B20和MAX31850

項目開源鏈接 github主頁https://github.com/snqx-lqh本項目github地址https://github.com/snqx-lqh/STM32F103C8T6HalDemo作者 VXQinghua-Li7 📖 歡迎交流 如果開源的代碼對你有幫助,希望可以幫我點個贊👍和收藏 項目說明 最近在做一個項目…

【合新通信】浸沒式液冷光模塊與冷媒兼容性測試技術報告

一、測試背景與核心挑戰 行業需求驅動 隨著800G/1.6T光模塊功耗突破30W/端口,傳統風冷已無法滿足散熱需求,浸沒式液冷成為超算/AI數據中心的主流方案。冷媒兼容性是系統可靠性的關鍵指標,涉及材料腐蝕、光學性能、長期穩定性等維度。 核心…

Pandas中的日期時間date處理

Pandas提供了強大的日期和時間處理功能,這對于時間序列分析至關重要。本教程將介紹Pandas中處理日期時間的主要方法。包括: 日期時間數據的創建和轉換日期時間屬性的提取時間差計算和日期運算重采樣和頻率轉換時區處理基于日期時間的索引操作 Pandas中…

Vue3文件上傳組件實戰:打造高效的Element Plus上傳解決方案,可以對文件進行刪除,查看,下載功能。

在現代Web開發中,文件上傳功能是許多應用的核心需求之一。無論是企業管理系統、內容管理系統還是醫療信息系統,上傳附件的功能都至關重要。本文將分享一個基于 Vue3 和 Element Plus 實現的文件上傳組件,結合父子組件的協作,展示如何構建一個功能強大、用戶體驗友好的文件上…

AI 工程師崛起:科技浪潮下的新興力量

在當今科技迅猛發展的時代,人工智能(AI)無疑是最熱門的領域之一。隨著基礎模型的涌現和開源 / API 的普及,一種新興的職業 ——AI 工程師,正逐漸嶄露頭角。他們在 AI 技術的應用和開發中扮演著關鍵角色,其崛…

人工智能與機器學習:Python從零實現邏輯回歸模型

🧠 向所有學習者致敬! “學習不是裝滿一桶水,而是點燃一把火。” —— 葉芝 我的博客主頁: https://lizheng.blog.csdn.net 🌐 歡迎點擊加入AI人工智能社區! 🚀 讓我們一起努力,共創…

濟南國網數字化培訓班學習筆記-第二組-5節-輸電線路設計

輸電線路設計 工程設計階段劃分 35kv及以上輸變電工程勘測設計全過程 可行性研究(包括規劃、工程選站)(包括電力系統一次二次,站址選擇及工程設想,線路工程選擇及工程設想,節能降耗分析,環境…

【Linux網絡】TCP服務中IOService應用與實現

📢博客主頁:https://blog.csdn.net/2301_779549673 📢博客倉庫:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請指正! &…

Linux 怎么找Java程序的監聽的端口

Linux 怎么找Java程序的監聽的端口 1、假設你知道啟動該Java應用的進程ID (PID),可以通過以下命令查找其監聽的端口: 首先找到該Java應用的PID: ps -ef | grep xxxx-1.0-RELEASE.jar或者,如果你知道啟動命令的一部分&#xff0…

解讀《數據資產質量評估實施規則》:企業數據資產認證落地的關鍵指南

隨著“數據要素市場”建設加速,數據資產逐步成為企業核心資產之一。2024年4月,由中國質量認證中心(CQC)發布的《數據資產質量評估實施規則》(編號:CQC96-831160-2024)正式實施,為企業…