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

Java 多執行緒同步機制深度實戰:從 synchronized 到 Concurrent 工具包全景解析

     編輯:Java 程式設計入門

為什麼需要執行緒同步?

在「單物件多執行緒」場景下,同步問題主要源自兩個維度:

  1. 共享變數競態:多執行緒同時讀寫同一實例變數,導致資料不一致
  2. 執行步驟交錯:業務邏輯要求多步操作具備原子性,但執行緒調度打亂了順序

共享變數同步的三種解決策略

策略一:將「單物件多執行緒」改為「多物件多執行緒」

每個執行緒持有獨立的 Runnable 實例,自然隔離實例變數。
缺點:無法真正共享狀態,適用於無狀態任務。

策略二:將實例變數降級為區域變數

將共享變數移入 run() 方法內部,每次呼叫各自擁有獨立副本。
優點:無鎖、效能最高、線程安全。
適用:變數生命週期僅限於單次任務執行。

策略三:使用 ThreadLocal 實現執行緒封閉

ThreadLocal 為每個執行緒提供獨立的變數副本,雖在程式碼層面看似共享,實則隔離。
適用:需跨方法傳遞執行緒上下文(如資料庫連線、Session、事務 ID)。

執行步驟同步:synchronized 關鍵字實戰

透過 synchronized(this) 或 synchronized(lockObj) 將關鍵區段序列化。

核心原則:縮小同步範圍

  • 同步區塊內嚴禁包含 I/O、睡眠、長時間運算等耗時操作
  • 過大範圍導致併發度驟降,且極易引發死鎖

死鎖經典案例

// 執行緒 1 持有 lockA 等待 lockB
// 執行緒 2 持有 lockB 等待 lockA
synchronized(lockA) {
    synchronized(lockB) { ... }
}

解決:統一鎖獲取順序、使用 tryLock(timeout)、避免嵌套鎖。

手工打造簡易執行緒池:從 Socket 連線池演進

文章示範如何基於 wait()/notify() 機制,構建支援 啟動、休眠、喚醒、停止 四種狀態的執行緒池,並透過 Socket 指令遠端控制。核心類別:

  • MyThread:攜帶狀態機的工作執行緒
  • MyThreadManager:統一管理執行緒生命週期
  • MyThreadPool:Socket 伺服器端,解析指令分派任務

此為教學示範,生產環境請直接使用 JDK 內建工具包。

JDK Concurrent 工具包:生產級解決方案全景

三大執行緒池實作

獲取執行緒返回值:Callable & CompletionService

  • Future<T> submit(Callable<T>):單任務異步結果
  • ExecutorCompletionService<T>:批次任務按完成順序收集結果

生產者-消費者模型:BlockingQueue 一行搞定

LinkedBlockingQueue 內建阻塞語義,put() 滿等、take() 空等,無需手寫 wait/notify。

信號量 Semaphore:控制併發存取數

new Semaphore(2) 允許同時 2 執行緒進入關鍵區,其餘阻塞等待。適用於資源池(連線池、許可證限流)。

協同屏障:CyclicBarrier vs CountDownLatch

類型特性適用場景
FixedThreadPool固定核心數,隊列無界長期穩定負載,控制併發上限
CachedThreadPool核心數 0,最大 Integer.MAX_VALUE,60s 回收閒置大量短生命週期任務
ScheduledThreadPool支援定時/週期性執行定時任務、延遲執行、週期輪詢
特性CyclicBarrierCountDownLatch
機制所有執行緒到達屏障點才能繼續,可重複使用倒數計數歸零釋放等待者,一次性
典型場景多執行緒分階段計算、迭代同步主執行緒等待多個初始化任務完成
核心方法await()countDown() / await()

最佳實踐總結

  1. 優先使用 java.util.concurrent 高階工具,減少手寫同步錯誤
  2. 共享變數優先選 區域變數 > ThreadLocal > 鎖
  3. 鎖粒度越小越好,嚴禁在同步區塊呼叫外部方法
  4. 執行緒池務必顯式關閉,避免資源洩漏
  5. 大量併發場景考慮無鎖資料結構(ConcurrentHashMap、LongAdder 等)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved