synchrosized 的可重入特性、死鎖、哲學家就餐問題以及解決死鎖的方法等干貨

文章目錄

  • 💐synchrosized的可重入特性
  • 關于死鎖:
  • 哲學家就餐問題
  • 💡如何避免/解決死鎖

💐synchrosized的可重入特性

可重入特性:當一個線程針對一個對象同時加鎖多次,不會構成死鎖,這樣的特性稱為可重入性

例如下圖:

在這里插入圖片描述

為了防止上述死鎖情況,synchrosized 就引入了可重入性解決;

線程在加鎖時,在這個鎖對象內部,它會記錄是對哪個線程加了鎖,當對同一個線程再次進行加鎖時,就會判斷該線程是不是同一個線程并且是否已經持有了鎖,如果已經有了鎖,那么也會重復進行加鎖,不會導致死鎖現象;

**那么,問題就來了,如果加兩次鎖,在 }2 的地方是否應該解鎖呢?**答案:不能釋放鎖

在這里插入圖片描述

如果加了n次鎖呢?該怎么去釋放呢?

答案:在鎖對象中,不僅會記錄對哪個線程加了鎖,還會有一個計數器記錄加鎖的次數;如果對同一個線程加鎖多次,那么每當執行完一個加鎖的代碼塊時,計數器就會減1,一直到最后一個鎖時,才會釋放鎖;

關于死鎖:

  1. 在Java中,如果一個線程對同一個鎖連續加鎖兩次,不會造成死鎖現象

  2. 如果兩個線程,兩把鎖,每個線程都嵌套的加兩個不同的鎖,就會造成死鎖現象

例如:讓線程1先獲取 lock1,線程2獲取 lock2,然后在 thread1 的內部再嘗試獲取 lock2,在 thread2 的內部再嘗試獲取 lock1

public static void main(String[] args) {//定義兩把鎖Object lock1 = new Object();Object lock2 = new Object();//讓線程1嵌套獲取兩把鎖Thread thread1 = new Thread(() -> {synchronized (lock1) {//此處睡眠很重要,如果沒有睡眠,線程1可能就會一下子把兩把鎖都獲取了,就構不成死鎖現象了try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}synchronized (lock2) {System.out.println("thread1加鎖成功");}}});//讓線程2嵌套獲取兩把鎖Thread thread2 = new Thread(() -> {synchronized (lock2) {try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}synchronized (lock1) {System.out.println("thread2加鎖成功");}}});thread1.start();thread2.start();}

執行結果:
在這里插入圖片描述

3. n個線程,m把鎖,也容易出現死鎖問題,例如哲學家就餐問題:

哲學家就餐問題

在這里插入圖片描述

死鎖 是一個比較嚴重的bug,那如何避免/解決死鎖呢?

💡如何避免/解決死鎖

要想避免死鎖,就要先知道死鎖是怎么形成的,這樣才能對癥下藥,導致死鎖的四個必要條件:

1.互斥使用:當線程1獲取鎖之后,線程2也想獲取同一把鎖,就會阻塞等待(鎖的特性)

2.不可搶占:當線程1已經獲取到鎖之后,線程2不能強行搶占鎖(鎖的特性)

3.請求保持:一個線程嘗試獲取多把鎖(一個線程獲取到鎖1之后,還想嘗試獲取鎖2,此時鎖1也并未解鎖)例如上面的嵌套加鎖代碼

4.循環等待:線程獲取鎖時,形成了環路;例如,上面哲學家同時拿起左邊的筷子

第一點和第二點是鎖的特性,如果想要解決死鎖,就要破壞第三點和第四點,

對于第三點來講,只要避免兩把不同的鎖嵌套獲取即可

在這里插入圖片描述

對于第四點來講,可以約定給所有的鎖進行一個編號,規定所有的線程只能按順序先獲取編號小的鎖,然后獲取編號大的,例如:

在這里插入圖片描述

在這里插入圖片描述

以上雖然時嵌套加鎖的,但是并未形成環路,得到lock1鎖的線程執行,未獲得lock1的線程阻塞等待,并且也無法獲得lock2

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

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

相關文章

前端學習第一天-html基礎

達標要求 網頁的形成過程 常用的瀏覽器及常見的瀏覽器內核 web 標準三層組成 什么是HTML 熟練掌握HTML文檔結構 熟練掌握HTML常用標簽 1. 初識web前端 Web前端是創建Web頁面或App等前端界面呈現給用戶的過程。 Web前端開發是從網頁制作演變而來,早期網站主…

sklearn.preprocessing.RobustScaler(解釋和原理,分位數,四分位差)

提示:sklearn.preprocessing.RobustScaler(解釋和原理,分位數,四分位差) 文章目錄 [TOC](文章目錄) 一、RobustScaler 是什么?二、代碼1.代碼2.輸出結果 總結 提示:以下是本篇文章正文內容&…

ELK學習

ELK 一、ELK介紹 😄 “ELK”是三個開源項目的首字母縮寫,這三個項目分別是:Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一個搜索和分析引擎。Logstash 是服務器端數據處理管道,能夠同時從多個來源采集數據&#xff0…

網絡編程(IP、端口、協議、UDP、TCP)【詳解】

目錄 1.什么是網絡編程? 2.基本的通信架構 3.網絡通信三要素 4.UDP通信-快速入門 5.UDP通信-多發多收 6.TCP通信-快速入門 7.TCP通信-多發多收 8.TCP通信-同時接收多個客戶端 9.TCP通信-綜合案例 1.什么是網絡編程? 網絡編程是可以讓設…

Redis的事務

在 Redis 中,事務(Transaction)是一組命令的集合,可以作為一個單獨的操作來執行,保證這組命令要么全部執行成功,要么全部執行失敗,具有原子性。在 Redis 中,事務是通過 MULTI、EXEC、…

repo介紹和安裝

介紹 https://blog.devwiki.net/2023/11/27/Windows-repo.html 安裝: https://blog.csdn.net/ysy950803/article/details/104188793

網絡安全-appcms-master

一、環境 gethub上面自己找appcms-master 二、開始闖關 原理:在評論的時候提交可以提交到管理員列表去,管理員一看cookie和地址就被盜走了 點進去軟件后會發現提交按鈕 隨便提交一下看看 放到div標簽里面是不是有可能可以做,看看后臺吧 那…

初學者如何學習python

Python 作為當今最受歡迎的編程語言之一,已經被包括谷歌、優步、Instagram 等知名公司廣泛采用于他們的應用程序開發。由于其易學易用的特性,Python 成為了編程初學者的首選語言。特別是在機器學習和數據科學領域,Python 的應用更是讓它成為了…

VUE CLI3項目搭建 ESLint配置

VUE項目框架配置 一、工具準備 Node.js安裝 安裝方法:點擊查看WebStorm安裝 下載地址:點擊查看 二、環境準備 鏡像準備 1.查看代理:npm get registry 2.設置淘寶鏡像 2.1臨時使用. npm --registry https://registry.npm.taobao.org ins…

【電機仿真】空間矢量脈寬調制(SVPWM)算法與實現

前言 文章【電機仿真】永磁同步電機模型中所提及了PMSM數學模型,模型算法是電機控制的理論基礎,但在實際控制中,需要將這兩部分具象化。實際電機所需要的總是三相電流或者電壓,控制對象為逆變器中的開關器件,我們需要將…

springboot基于web的音樂網站論文

音樂網站 摘要 隨著信息技術在管理上越來越深入而廣泛的應用,管理信息系統的實施在技術上已逐步成熟。本文介紹了音樂網站的開發全過程。通過分析音樂網站管理的不足,創建了一個計算機管理音樂網站的方案。文章介紹了音樂網站的系統分析部分&#xff0c…

114.龍芯2k1000-pmon(13)- 串口如何用

本文是講原理圖的部分,跟pmon的關系不大!! 參考手冊:《龍芯2K1000處理器用戶手冊.pdf》 剛剛看數據手冊,讓我是有點驚訝,但是也讓我迷惑。(一個串口復用為4個是啥意思?)…

Java項目:32 基于springboot的課程作業管理系統(含源碼數據庫+文檔免費送)

作者主頁:源碼空間codegym 簡介:Java領域優質創作者、Java項目、學習資料、技術互助 文中獲取源碼 項目介紹 管理員:首頁、個人中心、公告信息管理、班級管理、學生管理、教師管理、課程類型管理、課程信息管理、學生選課管理、作業布置管理…

CK98-數學家鍵盤配置

官方驅動和說明書下載地址 https://www.coolkiller.cn/download/lists_6.html 介紹:https://new.qq.com/rain/a/20221229A09B1M00 官方CK-98數學家驅動版本(謹慎更新) 如果升級驅動出現問題,重啟驅動軟件后會默認讓你恢復的。 …

[藍橋杯 2020 省 AB3] 日期識別

每日一道算法題之日期識別 一、題目描述二、思路三、C代碼 一、題目描述 題目來源:洛谷 【藍橋杯 2020 第三輪省賽 AB 組 F 題】小藍要處理非常多的數據, 其中有一些數據是日期。 在小藍處理的日期中有兩種常用的形式:英文形式和數字形式。英文形式采用…

利用小蜜蜂AI智能問答ChatGPT+AI高清繪圖生成圖文故事案例

利用小蜜蜂AI智能問答ChatGPTAI高清繪圖生成圖文故事案例 這段時間利用小蜜蜂AI網站做了一些編程、繪圖以及數據分析方面的案例。再過幾個月,我的大孫子就要出生了。我要用小蜜蜂AI智能問答和AI高清繪圖為大孫子生成一個1-9的數字圖文故事。 小蜜蜂AI網站可以掃如…

程序項目打包發布方法,采用InstallShield軟件

重點: 1.程序項目做出來了,需要打包發布給用戶。如何打包是關鍵。 2.采用InstallShield軟件進行發布。 步驟一:創建一個依賴三方庫配置環境的bat文件的項目。 (主要測試三方庫打包 和如果有bat文件,需要先創建環境&…

讀書筆記-三國演義-曹操

魏武帝曹操(155年-220年),是中國東漢末年至三國時期的重要政治家、軍事家和文學家,同時也是三國時期魏國的建立者。他以其雄才大略、果斷機敏的領導才能以及卓越的軍事才華而聞名于世。 生平 曹操出生于豫州譙縣&…

C++STL排序原理簡介

../chromedriver 一份簡化的代碼(可讀性較強)一份簡化的代碼(可讀性較強) 一份簡化的代碼(可讀性較強) c 的sort用了很多年,一直不知道具體是怎么寫的 決定看看代碼,以下文章結構可能有點混亂,建議讀者同時打開vs同步跳轉 https://www.geeksf…

一文認識藍牙(驗證基于Aduino IDE的ESP32)

1、簡介 藍牙技術是一種無線通信的方式,利用特定頻率的波段(2.4GHz-2.485GHz左右),進行電磁波傳輸,總共有83.5MHz的帶寬資源。 1.1、背景 藍牙(Bluetooth)一詞取自于十世紀丹麥國王哈拉爾Haral…