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

Java 多執行緒與並發程式設計核心總結

     編輯:Java 綜合教學

Java 多執行緒與並發程式設計核心總結

一、計算機系統基礎與並發起源

現代計算機系統為了提高 CPU 利用率,引入了多任務處理機制。從單核心的時間片輪轉,到多核心的真正並行執行,並發程式設計成為充分發揮硬體效能的關鍵。Java 作為企業級開發主流語言,提供了豐富的並發工具與機制。

二、執行緒基礎與生命週期

1. 建立執行緒的三種方式

  • 繼承 Thread 類別:覆寫 run() 方法
  • 實作 Runnable 介面:實作 run() 方法,配合 Thread 執行(推薦,支援多型)
  • 實作 Callable 介面:配合 FutureTask 可取得回傳值與拋出異常

2. 執行緒六大狀態

NEW → RUNNABLE → BLOCKED/WAITING/TIMED_WAITING → TERMINATED。理解狀態轉換對診斷死結、飢餓等問題至關重要。

三、執行緒安全與同步機制

1. 核心問題:原子性、可見性、有序性

  • 原子性:操作不可分割,使用 synchronized、Lock、原子類別
  • 可見性:一個執行緒修改後對其他執行緒立即可見,使用 volatile、synchronized、final
  • 有序性:防止指令重排序,使用 volatile、synchronized、happens-before 規則

2. synchronized 關鍵字深度解析

// 修飾實例方法:鎖住 this
public synchronized void method() { }

// 修飾靜態方法:鎖住 Class 物件
public static synchronized void staticMethod() { }

// 同步區塊:精確控制鎖範圍
public void method() {
    synchronized(lockObject) {
        // 臨界區程式碼
    }
}

3. Lock 介面與 ReentrantLock

提供比 synchronized 更靈活的控制:可中斷鎖、超時等待、公平/非公平鎖、條件變數等。

四、Java 記憶體模型 (JMM)

定義主記憶體與工作記憶體交互規範,happens-before 規則是判斷執行緒安全的核心依據:

  • 程式次序規則
  • 鎖規則(unlock happens-before lock)
  • volatile 變數規則
  • 執行緒啟動規則(start() happens-before 執行緒內動作)
  • 執行緒終止規則
  • 傳遞性

五、並發容器與工具類

分類代表類別適用場景
並發 MapConcurrentHashMap高併發快取、計數器
阻塞佇列ArrayBlockingQueue, LinkedBlockingQueue生產者-消費者模式
執行緒安全集合CopyOnWriteArrayList/Set讀多寫少、遍歷頻繁
同步工具CountDownLatch, CyclicBarrier, Semaphore協調多執行緒執行順序
原子類別AtomicInteger, AtomicReference無鎖計數器、CAS 操作

六、執行緒池與 Executor 框架

1. 核心參數(ThreadPoolExecutor)

  • corePoolSize:核心執行緒數
  • maximumPoolSize:最大執行緒數
  • keepAliveTime:非核心執行緒存活時間
  • workQueue:任務佇列
  • threadFactory:執行緒工廠
  • handler:拒絕策略

2. 四種預設執行緒池(不建議生產直接使用)

  • FixedThreadPool:固定大小,適合負載穩定
  • CachedThreadPool:動態伸縮,適合短任務爆發
  • SingleThreadExecutor:單執行緒序列化執行
  • ScheduledThreadPool:定時/週期性任務

3. 生產環境建議:自訂執行緒池

ThreadPoolExecutor executor = new ThreadPoolExecutor(
    4, 8, 60L, TimeUnit.SECONDS,
    new LinkedBlockingQueue<>(1000),
    new ThreadFactoryBuilder().setNameFormat("biz-%d").build(),
    new ThreadPoolExecutor.CallerRunsPolicy()  // 拒絕策略:呼叫者執行
);

七、並發設計模式與最佳實踐

  • Immutable 模式:final 修飾、無 setter、防禦性複製
  • ThreadLocal 模式:執行緒隔離儲存,注意記憶體洩漏風險
  • 生產者-消費者:阻塞佇列解耦
  • Future/CompletableFuture:非同步計算編排
  • 避免過早優化:先正確,再效能,使用工具(JVisualVM, Arthas)定位瓶頸

八、常見並發陷阱

  • 雙重檢查鎖單例(需 volatile)
  • HashMap 多執行緒擴容死循環(JDK 1.7)
  • ThreadLocal 記憶體洩漏(未 remove)
  • synchronized 鎖住非 final 物件
  • 佇列無界導致 OOM

深入掌握 Java 並發需要理論結合實戰,建議從 JMM、synchronized、Lock、並發容器、執行緒池、CompletableFuture 等核心模組系統學習,並多閱讀優秀開源專案(如 Netty、Disruptor)原始碼。

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