Java中的死鎖


鎖的合理使用能夠保證共享數據的安全性,但是 使用不當也會可能引起死鎖。


1. 死鎖概念

死鎖是指兩個或兩個以上的線程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力干涉那它們都將無法推進下去,如果系統資源充足,進程的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則就會因爭奪有限的資源而陷入死鎖。


2. 死鎖原因

  1. 互斥條件(Mutual Exclusion)
    資源一次只能被一個線程獨占使用。
  2. 持有并等待(Hold and Wait)
    線程在持有至少一個資源的同時,還在等待其他線程持有的資源。
  3. 不可搶占(No Preemption)
    資源不能被強制釋放,只能由持有它的線程主動釋放。
  4. 循環等待(Circular Wait)
    存在一個線程等待鏈,每個線程都在等待下一個線程持有的資源。

當這四個條件同時滿足時,死鎖必然發生。

3. 死鎖演示

下面的一段代碼演示了死鎖:

public static void main(String[] args) {Object lockA = new Object();Object lockB = new Object();new Thread(() -> {synchronized (lockA) {System.out.println(Thread.currentThread().getName() + ", 獲取了🔒A");try {sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}synchronized (lockB) {System.out.println(Thread.currentThread().getName() + ", 獲取了🔒B");}}}, "線程1").start();new Thread(() -> {synchronized (lockB) {System.out.println(Thread.currentThread().getName() + ", 獲取了🔒B");try {sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}synchronized (lockA) {System.out.println(Thread.currentThread().getName() + ", 獲取了🔒A");}}}, "線程2").start();
}

執行結果:


4. 死鎖檢測

4.1 命令

jps -l

jstack pid

jstack 6612



4.2 圖形工具 jconsole


5. 避免死鎖

  • 避免一個線程同時獲取多個不同的鎖
  • 避免一個線程在鎖內同時占用多個資源 盡量保證每個鎖只占一個資源
  • 嘗試使用帶超時時間到鎖 ,例如 lock.tryLock(timeout) 來替代內部鎖機制
  • 對于數據庫鎖 加鎖和解鎖必須在同一個數據庫連接里,否則會出現解鎖失敗的情況
  1. 按固定順序獲取鎖。
  2. 使用超時機制(tryLock)。
  3. 減少鎖的持有時間和粒度。
  4. 利用高級并發工具替代顯式鎖。

通過合理設計代碼結構、遵循鎖順序約定,以及利用Java并發工具包,可有效避免死鎖問題。

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

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

相關文章

基于STM32F103C8T6的智能家居健康環境監測系統

項目開發背景 隨著城市化進程加速和居民生活水平提升,人們對家居環境健康與安全的需求日益增強。現代住宅常因裝修材料、密閉空間及外部污染導致甲醛超標、PM2.5濃度升高、溫濕度失衡等問題,長期暴露此類環境中易引發呼吸道疾病、過敏反應等健康隱患。傳…

2025職場進階:B端產品經理必備的計算機專業技能精要

當前企業級服務市場競爭日益激烈,2025年的B端產品經理不僅需要深厚的行業認知,還必須具備扎實的計算機專業技能,才能設計出真正符合技術趨勢與業務需求的企業級產品。而其中,人工智能技術已經成為B端產品不可或缺的組成部分&#…

有效三角形的個數(數組單調性)

目錄 一:題目鏈接 二:題目思路 三:代碼實現 一:題目鏈接 題目的要求是找出當前數組能組成三角形三元組的個數。 二:題目思路 有一種暴力枚舉解法,利用三層 for 循環來一一枚舉三元組的情況,如…

Rust在醫療系統中的應用:安全、性能與合規性實踐(上)

Rust在醫療系統中的應用:安全、性能與合規性實踐 摘要 醫療系統對軟件安全與性能存在嚴苛雙重需求,既需抵御內存漏洞、數據加密風險等安全威脅(如歷史醫療設備因軟件問題召回案例所示),又需滿足電子健康記錄(EHR)系統、醫學影像處理等高并發數據場景的性能要求,同時需…

讀寫鎖 shared_mutex 共享互斥量介紹

文章目錄讀數據對數據沒有影響,為什么還需要shared_mutex1. 保證讀取數據的“一致性”和“時效性”2. 協調“讀”與“寫”的競爭關系總結好的,我們來詳細介紹 C17 中的 std::shared_mutex(共享互斥量,俗稱讀寫鎖)的使用…

Nestjs框架: 基于裝飾器與Guards的完成RBAC權限系統設計與實現

概述 在現代權限管理系統中,RBAC(基于角色的訪問控制)是廣泛采用的一種模型RBAC 核心思想是通過角色來管理用戶權限通過角色綁定用戶、資源和權限,實現細粒度的訪問控制為了實現這一目標,我們需要在數據庫中設計合理的…

機器學習如何精準預測高值

一、概念理解“機器學習對于高值的預測保守”,這是建模里很常見的現象,尤其在生態、氣候、遙感這類數據分布高度偏斜的場景。通常可以從以下幾個角度理解:1. 數據分布與樣本稀缺在訓練集里,高值樣本往往非常少,遠低于中…

蜂窩物聯網模組:智能門禁產品上的關鍵部件

隨著物聯網技術的快速發展,蜂窩物聯網模組正逐步成為智能門禁系統的關鍵通信組件。蜂窩模組憑借其廣覆蓋、高可靠性和低功耗特性,正從傳統門禁系統的補充角色轉變為智能門禁的核心通信組件,尤其在智慧社區、商業樓宇和政府機構等場景中展現出…

[光學原理與應用-417]:非線性光學 - 線性光學(不引發頻率的變化)與非線性光學(引發頻率變化)的異同

一、定義與物理機制:線性響應 vs 非線性響應線性光學定義:光與物質相互作用時,介質的極化強度與入射光電場強度呈線性關系(P?0?χ(1)E),輸出光強與輸入光強成正比(Iout?∝Iin?)-…

深入探討AI在三大核心測試場景中的應用

隨著人工智能(AI)技術的迅猛發展,軟件測試領域正經歷深刻變革。傳統手動測試和基于規則的自動化測試已難以應對日益復雜的系統架構與海量用戶行為。AI測試通過引入機器學習、自然語言處理、計算機視覺等技術,顯著提升了測試效率、…

[linux倉庫]性能加速的隱形引擎:深度解析Linux文件IO中的緩沖區奧秘

🌟 各位看官好,我是egoist2023! 🌍 Linux Linux is not Unix ! 🚀 今天來學習C語言緩沖區和內核緩存區的區別以及緩存類型。 👍 如果覺得這篇文章有幫助,歡迎您一鍵三連&#xff0c…

一、計算機的數據存儲

計算機的世界只有0和1。 1.1 進制 十進制整數->二進制整數:除2倒取余二進制->十進制:權值相加法 結論:1位8進制值 3位二進制值,1位十六進制值 4位二進制值 public class JinZhiDemo {public static void main(String[]…

SpringBoot集成XXL-JOB保姆教程

第一步: 下載xxl-job源碼到本地,地址如下: xxl-job: 一個分布式任務調度平臺,其核心設計目標是開發迅速、學習簡單、輕量級、易擴展。現已開放源代碼并接入多家公司線上產品線,開箱即用。 第二步: 創建…

Debezium日常分享系列之:Debezium 3.2.2.Final發布

Debezium日常分享系列之:Debezium 3.2.2.Final發布Debezium CoreConnector啟動時出現難以理解的錯誤臨時阻塞快照失敗可能導致數據丟失的問題修復Debezium for OracleDebezium CoreConnector 啟動時出現難以理解的錯誤 我們解決了一個問題,即連接器會因…

Zoom AI 技術架構研究:聯合式方法與多模態集成

一、研究背景與概述 在當今數字化轉型加速的背景下,人工智能技術正深刻改變企業協作與溝通方式。作為全球領先的視頻會議平臺,Zoom 已從單純的通信工具轉型為全面的生產力平臺,而其 AI 技術架構是這一轉變的核心驅動力。本報告將深入分析 Zoom 的 AI 技術架構,特別是其創新…

排序-快速排序 O(n log n)

快排:1、設定一個中間值 q[ lr >>1 ] , 讓左右區間來比較2、左邊通過 i 依次比較,如果比這個中間值小,就繼續 , 直到不符合3、右邊通過 j-- 依次比較,如果比這個中間值大,就繼續 ,直到不符合4、兩邊…

【Proteus仿真】定時器控制系列仿真——LED小燈閃爍/流水燈/LED燈帶控制/LED小燈實現二進制

目錄 0案例視頻效果展示 0.1例子1:基于AT89C51單片機的定時器控制小燈閃爍 0.2例子2:基于AT89C51單片機的定時器T0流水燈 0.3例子3:基于AT89C51單片機的定時器控制LED燈帶 0.4例子4:基于AT89C51單片機的定時器控制LED閃爍 0…

進階向:密碼生成與管理工具

密碼生成與管理工具:從零開始的完全指南在現代數字生活中,密碼是保護個人信息和賬戶安全的第一道防線。隨著網絡服務的普及,每個人平均需要管理數十個不同賬戶的密碼。一個強大且獨特的密碼通常應包含12個以上字符,混合大小寫字母…

解決 Gitee 中 git push 因郵箱隱私設置導致的失敗問題

解決 Gitee 中 git push 因郵箱隱私設置導致的失敗問題 在使用 Git 向 Gitee 遠程倉庫推送代碼時,可能會遇到因郵箱隱私設置引發的 git push 失敗情況。最近我就碰到了,現在把問題現象、原因和解決方法分享出來。 一、錯誤現象 執行 git push -u origin …

Flutter的三棵樹

“三棵樹”是 Flutter 渲染和構建UI的核心機制,理解它們對于掌握 Flutter 至關重要。這三棵樹分別是: Widget 樹 Element 樹 RenderObject 樹 它們協同工作,以實現 Flutter 的高性能渲染和高效的響應式編程模型。 Flutter 是聲明式的UI&…