線程同步相關知識

文章目錄

      • 一、線程同步的核心目標
      • 二、線程安全的判定條件
      • 三、同步方式一:synchronized 關鍵字
        • 1. 同步代碼塊
        • 2. 同步方法
      • 四、鎖的釋放與不釋放場景
        • 1. 自動釋放鎖的場景
        • 2. 不會釋放鎖的場景
      • 五、同步方式二:ReentrantLock(顯式鎖)
        • 1. 核心特性
        • 2. 使用規范
      • 六、synchronized 與 ReentrantLock 的對比
      • 總結

以下是對線程同步相關知識點的系統整理,涵蓋同步方式、鎖機制、線程安全條件及釋放規則等核心內容:

一、線程同步的核心目標

解決多線程并發操作共享資源時的線程安全問題(如數據不一致、重復修改等),通過控制線程對共享資源的訪問順序,保證操作的原子性、可見性和有序性。

二、線程安全的判定條件

出現線程安全問題必須同時滿足兩個條件:

  1. 多線程環境:程序運行在多個線程并發執行的場景中。
  2. 共享資源:多個線程操作的是同一份資源(如共享變量、對象屬性等)。

解決方案:通過“鎖機制”保證同一時間只有一個線程能操作共享資源,核心是所有線程必須使用同一把鎖

三、同步方式一:synchronized 關鍵字

synchronized 是 Java 內置的隱式鎖機制,通過“監視器(Monitor)”實現,可修飾代碼塊或方法。

1. 同步代碼塊
  • 語法

    synchronized (鎖對象) {// 需要同步的代碼(操作共享資源的邏輯)
    }
    
  • 核心要素

    • 鎖對象:可以是任意對象(通常使用共享資源本身或 this),但必須保證所有線程使用同一把鎖
    • 同步范圍:僅包含操作共享資源的代碼,范圍越小,效率越高。
  • 示例

    // 共享資源
    private int count = 0;
    private Object lock = new Object(); // 鎖對象// 多線程執行的方法
    public void increment() {synchronized (lock) { // 所有線程使用同一把lock鎖count++; // 操作共享資源}
    }
    
2. 同步方法
  • 語法:直接在方法聲明處添加 synchronized 關鍵字,隱式指定鎖對象。

    // 實例方法
    public synchronized void method1() { ... }// 靜態方法
    public static synchronized void method2() { ... }
    
  • 隱式鎖對象規則

    • 實例方法:鎖對象為 this(當前對象實例)。
    • 靜態方法:鎖對象為 類名.class(當前類的字節碼對象,全局唯一)。
  • 特點

    • 無需顯式指定鎖對象,簡化代碼,但同步范圍是整個方法(可能降低效率)。
    • 靜態同步方法和實例同步方法使用的是不同鎖(類對象 vs 實例對象),兩者不會互斥。

四、鎖的釋放與不釋放場景

synchronized 鎖的釋放由 JVM 自動管理,以下情況會觸發釋放或不釋放:

1. 自動釋放鎖的場景
  • 同步代碼塊或同步方法正常執行完畢(執行到代碼塊末尾)。
  • 同步代碼中出現未捕獲的異常或錯誤,導致線程終止。
  • 同步代碼中調用 wait() 方法(線程進入等待狀態,主動釋放鎖)。
  • 同步代碼中通過 breakreturn 等語句退出代碼塊/方法。
2. 不會釋放鎖的場景
  • 調用 Thread.sleep(long):線程休眠時仍持有鎖(其他線程無法獲取)。
  • 調用 Thread.yield():線程主動讓出 CPU,但鎖未釋放。
  • 線程被 suspend() 暫停(已過時方法):暫停期間仍持有鎖,可能導致死鎖。

五、同步方式二:ReentrantLock(顯式鎖)

java.util.concurrent.locks.ReentrantLock 是 JDK 提供的顯式鎖實現,比 synchronized 更靈活。

1. 核心特性
  • 可重入性:同一線程可多次獲取同一把鎖(與 synchronized 一致)。
  • 公平性:通過構造函數指定是否為公平鎖:
    ReentrantLock fairLock = new ReentrantLock(true); // 公平鎖(按請求順序獲取鎖)
    ReentrantLock nonfairLock = new ReentrantLock(false); // 非公平鎖(默認,可能插隊)
    
    • 公平鎖:線程按請求鎖的順序獲取鎖,避免饑餓,但效率較低。
    • 非公平鎖:允許線程“插隊”獲取鎖,效率更高,但可能導致部分線程長期等待。
2. 使用規范

必須手動獲取鎖和釋放鎖,且釋放操作需放在 finally 中,確保鎖一定被釋放:

ReentrantLock lock = new ReentrantLock();public void operation() {lock.lock(); // 手動獲取鎖try {// 操作共享資源(可能出現線程安全的代碼)} finally {lock.unlock(); // 手動釋放鎖,必須在finally中}
}

六、synchronized 與 ReentrantLock 的對比

特性synchronizedReentrantLock
鎖類型隱式鎖(JVM 自動管理)顯式鎖(手動獲取和釋放)
公平性僅支持非公平鎖可通過構造函數指定公平/非公平
可中斷性不可中斷支持中斷(lockInterruptibly()
條件變量僅支持 wait()/notify()支持多個 Condition 對象,更靈活
性能JDK 1.6 后優化,與 ReentrantLock 接近高并發下略優,功能更豐富

總結

  1. 線程同步的核心是通過鎖機制控制共享資源的并發訪問,需保證多線程使用同一把鎖。
  2. synchronized 適合簡單場景,隱式管理鎖的獲取和釋放,易用性高。
  3. ReentrantLock 適合復雜場景(如公平性控制、中斷處理),需手動管理鎖,靈活性更高。
  4. 無論使用哪種鎖,都需注意鎖的釋放時機,避免死鎖(如 sleep() 不釋放鎖可能導致的問題)。

合理選擇同步方式是保證多線程程序正確性和效率的關鍵。

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

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

相關文章

Armoury Crate無法通過BIOS卸載

設備:天選4 Armoury Crate窗口反復彈出影響使用體驗,但無法通過BIOS關閉該怎么辦?本文以天選4為例提供解決方案。 Step1:進入服務支持官網 Armoury Crate-服務支持 下滑點擊”查看更多” 下載安裝卸載工具 得到Armoury_Crate_Un…

如何將視頻轉為GIF格式,3大視頻轉為GIF工具

在社交媒體和即時通訊盛行的當下,GIF 動圖以其獨特的魅力備受青睞。它能夠生動地捕捉視頻中的精彩瞬間,憑借體積小巧、無需復雜加載且可循環播放的特性,成為了人們在網絡交流中表達情感、分享趣事的得力工具。無論是制作詼諧幽默的表情包&…

開發避坑指南(22):Vue3響應式編程中this綁定機制與解決方案

錯誤信息 TypeError: Cannot read properties of undefined (reading find) TypeError: r.vnode.el.querySelector is not a function報錯背景 vue2項目升級到vue3后,原來的代碼報錯。 報錯代碼computed: {/** 計算列的顯示與隱藏*/columnVisible() {return functio…

AI學習筆記三十五:實時傳輸視頻

若該文為原創文章,轉載請注明原文出處。 目的是實現視頻的傳輸,只是個demo. 程序分為兩部分,視頻接收端和視頻發送端。 一、視頻接收端流程分析 主要流程: 初始化配置: 設置UDP端口(5001)和緩…

【ArcGIS】分區統計中出現Null值且Nodata無法忽略的問題以及shp擦除(erase)的使用——以NDVI去水體為例

需求 已有某地NDVI柵格、行政區shp以及水體shp,計算每個行政區的平均NDVI 問題 1.如果不剔除水體 負值NDVI會把平均值拉低 且水體NDVI并不全為負 需要通過shp剔除,Mask掩膜是提取水體本身而不是剩余部分 2.使用分區統計工具(Zonal statis…

Linux中的內核同步源碼相關總結

什么是內核同步Linux 內核同步是指內核中用于解決并發執行單元(如進程、中斷、內核線程等)對共享資源(如全局數據結構、硬件寄存器、鏈表等)的競爭訪問的一系列機制和技術。其核心目標是保證多個并發單元在操作共享資源時的數據一…

WORD接受修訂,并修改修訂后文字的顏色

在 Word 中,接受修訂之后默認會采用正文的默認字體格式,不會保留修訂時設置的顏色,比如“插入內容是藍色字體”的設置會被清除。 如果你想要做到:? 接受所有修訂后仍然讓“原插入的文字”變為藍色字體保留下來你只能通過一些手動…

行業速覽:中國新能源汽車市場格局與關鍵趨勢

在全球汽車產業邁向綠色、低碳、智能化的變革浪潮中,新能源汽車已成為各國爭奪的戰略高地。中國,作為全球最大的汽車市場和新能源汽車制造國,正以強大的市場規模、完整的產業鏈體系以及快速提升的技術創新能力,在這場變革中不斷加…

【51單片機2個按鍵控制流水燈轉向】2022-10-25

緣由51單片機按鍵流水燈-嵌入式-CSDN問答 #include "REG52.h" sbit k1P3^0; sbit k2P3^1; void main() {unsigned char l0,xd0,ys10,ys20,z0;P1l;while(1){if(k10&&xd0){z0;while(k10);}if(k20&&xd0){z1;while(k20);}if(ys10)if(ys20){if(z0)if(l0)…

flutter開發(一)flutter命令行工具

安裝 Linux下面的flutter安裝比較簡單,在flutter 中文戰 上下載一個最新穩定的版本,解壓到系統上就行了。 我下載的是Linux下的3.32.7版。 解壓之后,flutter目錄里會有bin、dev等目錄,把bin目錄加到系統的PATH環境變量里&#…

OpenCV 入門實戰:從環境配置到圖像 / 視頻處理

OpenCV 是計算機視覺領域最常用的開源庫之一,它提供了豐富的圖像和視頻處理功能。本文將從環境配置開始,帶大家一步步解析基礎操作代碼,快速入門 OpenCV 的使用。 一、環境配置 在開始之前,我們需要先搭建好 OpenCV 的運行環境。…

2.2.1 飾面板材和陶瓷的特性和應用

1、飾面石材1)天然花崗巖2)天然大理石3)人造石(1)人造石按主要原材料分包括人造石實體面材、人造石英石和人造石崗石等產品。2、建筑衛生陶瓷建筑衛生陶瓷包括建筑陶瓷和衛生陶瓷兩大類。建筑陶瓷包括陶瓷磚、建筑琉璃…

C++的結構體數組

結構體數組的基礎知識 結構體數組通過??組合數據批量管理??的特性,廣泛應用于學生管理、游戲角色屬性存儲等場景。常見問題 ??數組越界??:靜態數組長度固定,超過數組長度的訪問,會導致未定義行為。??未初始化成員??&a…

小程序中使用echarts(2025/8/8)

這篇博文講的很詳細,也很簡潔,這里補充一點東西 小程序中使用echarts(硬貨,全網最詳細教程!)_小程序使用echarts-CSDN博客 簡單來說就是去官網下載ec-canvas組件,將其中的echarts.js換成echarts.min.js(原…

【SpringBoot】SpringBoot配置

根據自動配置原理 學習后,整理學習筆記 一定要耐心去看,耐著性子去學習,慢慢慢慢就明白了 配置深化學習 前提 通過 SpringBootApplication 找到 EnableAutoConfiguration;發現 Import({AutoConfigurationImportSelector.class})…

網絡安全與軟件定義汽車的發展

在許多汽車公司,同一個系統工程團隊同時負責安全(safety)和安防(security)。因此,網絡安全被視為安全(safety)的一個子集,其根源在于一個隱含的假設:“如果安…

字典列表依據數值鍵排序

要根據字典列表中的特定數值鍵進行排序,我們可以使用 Python 的 sorted() 函數配合自定義排序鍵。以下是操作方法: 1. 按升序排序(從小到大) sorted_list sorted(original_list, keylambda x: x[數值鍵名])2. 按降序排序&#xf…

五、SpringBoot工程打包與運行

SpringBoot工程打包與運行 1、SpringBoot項目快速啟動(Windows版) (1)對SpringBoot項目打包(執行Maven構建指令package): mvn package (2)運行項目(執行啟動指令) java -jar springboot.jar 2、…

構建高可用架構:ZDNS GSLB 在多數據中心場景下的應用與 F5 替換實踐

隨著互聯網的快速發展,金融機構、大型企業等組織單位,出于自身業務發展的需要和國家監管的要求,紛紛通過建設多數據中心來提升不同地區的用戶體驗,同時避免不可抗力因素帶來的巨大損失。ZDNS GSLB 全局負載均衡技術,能…

【JMeter】壓測腳本生成完善增強

JMeter 壓測腳本生成完善增強0. 通過JMeter代理服務器錄制腳本1. 設置客戶端的代理2. JMeter GUI配置 以及錄制腳本3. 調試腳本附錄0. 通過JMeter代理服務器錄制腳本 1. 設置客戶端的代理 JMeter代理服務器默認端口號就是8888 2. JMeter GUI配置 以及錄制腳本 新建線程組 …