線程入門3

synchronized修飾方法

synchronized可以修飾代碼塊(在線程入門2中有例子),也可以修飾普通方法和靜態方法。

修飾普通方法

修飾普通方法簡化寫法:

修飾靜態方法

修飾靜態方法簡化寫法:

注意:利用synchronized上鎖,鎖的對象是什么不重要,重要的的是兩個線程中鎖的對象是否是同一個對象。

synchronized 的可重入性

所謂的可重入性,指的是,一個線程,連續對一把鎖,加鎖兩次,或者更多次,不會出現死鎖,滿足這個條件就叫做“可重入性”。

例如下面代碼

假設在我們第一次加鎖時成功,那么locker就屬于鎖定狀態,緊接著往下繼續執行代碼,又發現需要對locker進行上鎖,但是剛才已經上過鎖了,正常來說,對已經在一個線程中上過鎖的對象,在另一個線程中又要對相同的對象進行上鎖,就會發生“阻塞等待”,需要這個對象被解鎖釋放后才能進行上鎖。

那么對于上面代碼這種情況就會產生“死鎖”,導致線程卡死,第二個想要加鎖成功就需要第一次釋放鎖,需要執行到程序“1號”位置,但是想要到“1號”位置 就需要 第二次能成功加鎖讓程序繼續往下走,由于第二次加鎖處在“阻塞等待“狀態,也就執不了代碼,最終到不了2號位置,也就無法釋放鎖,因此線程就直接被卡死了。

因此在Java中synchronized被設計成”可重入鎖“,就能夠有效解決問題。但C++中std::mutex就是不可重入鎖,就會出現死鎖。

還需注意:當出現這種重復 上鎖的情況時,在釋放鎖時,無論多少層都必須要在最外層釋放鎖

關于死鎖

死鎖的案例

1.一個線程,針對一把鎖,連續加鎖兩次及以上,如果是不可重入鎖,就會出現死鎖。

2.兩個線程,兩把鎖。此時無論是不是可重入鎖都回死鎖

上面這種情況就類似于生活中,家門鑰匙被鎖在車里了,車鑰匙被鎖在加里了。

3.N個線程,M把鎖 (此時更容易出現死鎖)

一個經典的模型就是”哲學家問題“

如圖所示:

有五個哲學家,桌子上有五根筷子,哲學家只做兩件事,一個是停下來思考人生什么都不做,另一個是拿起左邊和右邊的筷子吃面條。

哲學家什么時候吃面條,什么時候吃完停下來思考人生都是隨機的,如果其中一個哲學家拿起左右兩邊的筷子吃面條,此時相鄰的哲學家就只能等待他吃完放下筷子,就會出現阻塞等待。

本來正常運轉都沒什么問題,但是有一天突然出現,每個哲學家都先拿起左手邊的筷子,結果發現右手邊的筷子已經被拿了,此時哲學家也不會放下自己左邊的筷子,只會進行等待右邊何時放下筷子,這個時候沒人能吃上面條,也沒人能放下筷子,就導致了出現了死鎖。

死鎖是比較嚴重的bug(會導致線程卡住,也就無法在繼續執行后序工作了)

死鎖涉及到的四個必要條件

1.互斥使用 (鎖的基本特征)當一個線程持有一把鎖后,另一個線程想獲得鎖,就要進行阻塞等待。

2.不可搶占 (鎖的基本特征)當鎖已經被線程1拿到之后,線程2只能等待線程1主動釋放,不嫩惡搞強行搶過來。

3.請求保持 (代碼結構) 一個線程嘗試獲取多把鎖 (先拿到鎖1,嘗試獲取鎖2,獲取的時候,鎖1不會釋放,嵌套結構)

4.循環等待/環路等待 (代碼結構)等待的依賴關系形成環了(哲學家問題)

解決死鎖

解決死鎖的核心就是破壞上述的必要條件,只要破壞一個,死鎖就形成了,但一和二是synchronized的自帶的特性,無法干預,只能從3,4入手。

對于3來說,我們可以調整代碼結構,把嵌套鎖的結構,改成并列結構。

對于4來說,可以約定加鎖的順序,就可以避免循環等待 (例如針對鎖進行編號,加多把鎖的時候,先加編號小的鎖,再加編號大的鎖,所有線程都要遵循這個規則)

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

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

相關文章

linux上Flexlm命令

FlexLM 是一種靈活的許可證管理系統,廣泛用于各種軟件產品中,如 Autodesk 的 AutoCAD 和 Autodesk 的其他產品。它允許軟件開發商控制軟件的使用和分發,同時提供靈活的許可證管理策略。在 Linux 系統中使用 FlexLM 通常涉及到幾個關鍵步驟&am…

【Java學習方法】終止循環的關鍵字

終止循環的關鍵字 一、break 作用:跳出最近的循環(直接結束離break最近的那層循環) 使用場景:一般搭配if條件判斷,如果滿足某個條件,就結束循環,(場景:常見于暴力枚舉中…

【論文精讀】Reformer:高效Transformer如何突破長序列處理瓶頸?

目錄 一、引言:當Transformer遇到長序列瓶頸二、核心技術解析:從暴力計算到智能優化1. 局部敏感哈希注意力(LSH Attention):用“聚類篩選”替代“全量計算”關鍵步驟:數學優化: 2. 可逆殘差網絡…

關于在Springboot中設置時間格式問題

目錄 1-設置全局時間格式1.Date類型的時間2.JDK8時間3.使Date類和JDK8時間類統統格式化時間 2-關于DateTimeFormat注解 1-設置全局時間格式 1.Date類型的時間 對于老項目來說,springboot中許多類使用的是Date類型的時間,沒有用到LocalDateTime等JDK8時…

面試篇:Java并發與多線程

基礎概念 什么是線程?線程和進程的區別是什么? 線程 是程序執行的最小單位,它是 CPU 調度和執行的基本單元。一個進程可以包含多個線程,這些線程共享進程的資源(如內存),但每個線程有自己的棧…

【Qt/C++】QPrinter關于QInternal::Printer的解析

1. 問題分析 QInternal::Printer在Qt框架中并不是一個直接暴露給用戶的API。相反,它是一個枚舉值,用于標識QPaintDevice的類型。在Qt中,QPaintDevice是一個抽象類,用于任何可以進行繪制的設備,如窗口、圖像、打印機等…

uniapp返回上一頁接口數據更新了,頁面未更新

注意:不是組件套組件可以不使用setTimeout延時 返回上一頁一般會走onshow,但是接口更新了頁面未更新 onShow(() > {// 切換城市后重新調用數據if (areaId.value) {const timer setTimeout(async () > {timer && clearTimeout(timer);…

MCU開發學習記錄11 - ADC學習與實踐(HAL庫) - 單通道ADC采集、多通道ADC采集、定時器觸發連續ADC采集 - STM32CubeMX

名詞解釋: ADC: Analog-to-Digital SAR:Successive Approximation Register 本文將介紹ADC的概念、相關函數以及STM32CubeMX生成ADC的配置函數。針對于ADC實踐:單通道采集芯片內部溫度傳感器(ADC1_ch16)&a…

68元撬動未來:明遠智睿2351開發板重塑嵌入式開發生態

在嵌入式開發領域,價格與性能的矛盾始終存在:高端開發板功能強大但成本高昂,低價產品則往往受限于性能與擴展性。明遠智睿2351開發板以68元(含稅)的定價打破這一僵局,通過四核1.4G處理器、全功能Linux系統與…

關于ubuntu密碼正確但是無法登錄的情況

參考這個文章: https://blog.csdn.net/cuichongxin/article/details/117462494 檢查一下是不是用戶被lock了 輸入passwd -s username 如果用戶是L狀態,那么就是lock了。 使用 passwd -u username 解鎖 關于 .bashrc 不生效 有幾點: ~/.…

LeetCode-47. 全排列 II

1、題目描述: 給定一個可包含重復數字的序列 nums ,按任意順序 返回所有不重復的全排列。 示例 1: 輸入:nums [1,1,2] 輸出: [[1,1,2],[1,2,1],[2,1,1]]示例 2: 輸入:nums [1,2,3] 輸出&am…

Python 設計模式:訪問者模式

1. 什么是訪問者模式? 訪問者模式是一種行為設計模式,它允許你在不改變對象結構的前提下,定義新的操作。通過將操作封裝在訪問者對象中,訪問者模式使得你可以在不修改元素類的情況下,向元素類添加新的功能。 訪問者模…

基于stm32的智能門鎖系統

標題:基于stm32的智能門鎖系統 內容:1.摘要 摘要:隨著科技的飛速發展,人們對家居安全的要求日益提高,智能門鎖系統應運而生。本研究的目的是設計并實現一個基于STM32的智能門鎖系統。采用STM32微控制器作為核心控制單元,結合指紋…

GitHub 常見高頻問題與解決方案(實用手冊)

目錄 1.Push 提示權限錯誤(Permission denied) 2.push 報錯:rejected non-fast-forward 3.忘記添加 .gitignore,上傳了無關文件 4. 撤銷最近一次 commit 5.clone 太慢或失敗 6.如何切換/創建分支 7.如何合并分支 8.如何刪除遠程分支 9.如何 Fork + PR(Pull Reque…

【MySQL數據庫入門到精通-04 DML操作】

一、DML DML英文全稱是Data Manipulation Language(數據操作語言),用來對數據庫中表的數據記錄進行增、刪、改操作。 二、添加數據 1.給指定字段添加數據 代碼如下(示例): insert into 表名 (字段1,字…

2022 年 9 月青少年軟編等考 C 語言六級真題解析

目錄 T1. 棧的基本操作T2. stack or queue思路分析T3. 合影效果T4. 發型糟糕的一天思路分析T1. 棧的基本操作 題目鏈接:SOJ D1188 此題為 2022 年 6 月三級第二題僅有棧操作的版本,見 2022 年 6 月青少年軟編等考 C 語言三級真題解析中的 T2。 T2. stack or queue 題目鏈…

美創市場競爭力突出!《2025中國數據安全市場研究報告》發布

數據要素時代,數據已成國家戰略性資源,數據安全關乎國家安全!數說安全發布的《2025中國數據安全市場研究報告》(以下簡稱《報告》)顯示,2024年數據安全市場逆勢增長,市場規模首次突破百億。《報…

VUE Element-ui Message 消息提示組件自定義封裝

為了讓message 信息提示的更加方便快捷,減少不同地方的調用,避免代碼的重復,特意再官方message 組件的基礎上二次封裝,使代碼更加的優雅和高效。 實現效果: 代碼組件: 封裝成 message.js 文件,…

高防IP能抵御哪些類型的網絡攻擊?

高防IP(High Defense IP)是一種專門針對網絡攻擊設計的防護服務,主要通過流量清洗、協議分析、行為檢測等技術抵御多種網絡攻擊。以下是其能防御的主要攻擊類型及原理: ??一、常見防御的攻擊類型?? ??DDoS攻擊(分…

小紅書文字配圖平替工具

小紅書的文字配圖只有手機版有,想找一個電腦版的,查了一下。以下是幾款類似小紅書風格的花字、藝術字生成工具,適合制作吸睛的社交媒體配圖,分為 手機APP 和 在線工具 兩類,供你選擇: 一、手機APP推薦 醒圖…