首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 併發編程核心理論:共享性、互斥性、原子性、可見性與有序性深度講解

     編輯:Java 綜合教學

Java 併發編程核心理論:共享性、互斥性、原子性、可見性與有序性深度講解

併發編程難點在於正確處理共享可變數據。本文從五大理論支柱構建知識體系,配合代碼驗證與 JMM 圖解。

一、共享性:問題根源

若數據僅線程內可見,不存在安全問題。多線程必然共享數據(如數據庫連接池、緩存、單例)。

// 10線程各加100次,預期1000,實際<1000
static int count = 0;
void addCount() { count++; } // 非原子,競態條件

二、互斥性:同步手段

  • 讀讀可並發,寫寫/讀寫互斥。
  • synchronized 提供獨佔鎖,分共享鎖(讀)與排它鎖(寫)。
  • 加鎖後 addCount() 串行化,結果恆為 1000。

三、原子性:不可分割操作

i++ 三步:讀取、加一、寫回。多線程交織導致更新丟失。

// 線程A讀取100,線程B讀取100,均寫回101,丟失一次更新
  • 保證原子性:鎖(synchronized/Lock)或 CAS(AtomicInteger)。
  • CAS 缺陷:ABA 問題(值變回原值無法感知),AtomicStampedReference 解決。

四、可見性:JMM 內存模型

JMM 主內存/工作內存

  • 主內存存共享變量,各線程有工作內存(緩存)副本。
  • 無同步時,線程 A 寫入主內存,線程 B 可能仍讀舊緩存值。
  • volatile/synchronized 強制刷新/失效緩存,保證可見性。
// 可見性失效示例
static boolean ready = false;
static int number = 0;
// Writer: number=100; ready=true;
// Reader: if(!ready) print ready; print number; // 可能印 false 0

五、有序性:重排序規則

編譯器、處理器、內存系統三類重排序:

  1. 編譯器優化重排(單線程語義不變)。
  2. 指令級並行重排(無數據依賴)。
  3. 內存系統重排(緩存/寫緩衝)。
// JSR-133 合法重排示例
// 初始 x=y=0
// 線程1: x=1; r1=y;
// 線程2: y=1; r2=x;
// 可能結果 r1=0, r2=0 (指令重排導致)
  • volatile/synchronized 建立 happens-before 關系,禁止特定重排。

總結

掌握共享性→互斥性→原子性→可見性→有序性五層遞進關系,是寫出正確高效併發代碼的理論基石。後續實戰工具(JUC 包、並發集合、同步器)均建立於此。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved