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

TIJ 閱讀筆記(第十三章):Java 並發編程核心精要

     編輯:Java 相關知識

並發編程的動機與本質

線程是進程內部獨立的指令流,多線程讓程序能在等待事件(I/O、鎖、用戶輸入)時不阻塞主流程,實現響應式 UI、提升吞吐率、利用多核 CPU。Java 的線程模型屏蔽了底層調度細節,但要求開發者改變單線程思維,理解「同時運行」的非確定性。

基礎線程操作

創建與啟動

  • 繼承 Thread 覆寫 run(),調用 start() 啟動。
  • 實現 Runnable 接口,配合 new Thread(runnable).start(),避免單繼承限制,利於邏輯與線程控制分離。

常用控制方法

  • yield():提示調度器當前線程可讓出 CPU,非強制。
  • sleep(ms):強制休眠指定毫秒,需捕獲 InterruptedException,不釋放鎖。
  • join():等待目標線程終止,可設超時,可被中斷。
  • setPriority():設置優先級(1-10),僅為調度建議,不可依賴實現業務邏輯。

線程安全與同步機制

共享資源衝突

多線程並發讀寫共享變量會導致數據不一致(如 EvenGenerator 示例)。解決核心是「串行化訪問」:同一時刻僅允許一個線程進入臨界區。

synchronized 關鍵字

  • 同步方法: 隱式使用 this(實例方法)或 Class 對象(靜態方法)作為鎖。
  • 同步代碼塊: synchronized(lockObj) { ... },可精細控制鎖粒度,提高並發度。
  • 鎖可重入:同一線程可多次獲取同一鎖,JVM 維護計數器。

volatile 與原子操作

  • volatile 保證讀寫可見性與有序性,長整型/雙精度型需加 volatile 才屬原子操作。
  • 基本類型賦值/讀取(除 long/double)為原子操作;複合操作(如 i++)非原子,需同步或使用 AtomicInteger。

線程狀態與阻塞原因

狀態說明
NEW對象創建未啟動
RUNNABLE就緒/運行中
BLOCKED等待鎖、I/O、sleep、wait、join
TERMINATEDrun() 結束或異常退出

線程協作:wait/notify 與管道流

  • wait() 釋放鎖並進入等待集,notify()/notifyAll() 喚醒,必須在同步塊中調用。
  • PipedWriter/Reader 實現線程間字節/字符流傳輸,適合生產者-消費者場景。

死鎖與預防

四必要條件:互斥、佔有並等待、非搶佔、循環等待。破壞任一條件即可預防。Java 無內置死鎖檢測,需設計時避免(如固定鎖獲取順序、使用 tryLock 超時機制)。

線程終止最佳實踐

  • 棄用 stop()、suspend()、resume()(不釋放鎖、易損壞對象狀態)。
  • 採用標誌位(volatile boolean running)輪詢或 interrupt() 中斷阻塞操作(sleep/wait/join/I/O)。

線程組與總結

ThreadGroup 設計失敗,僅剩未捕獲異常處理用途。多線程優勢在於輕量級上下文切換、資源共享,但引入同步開銷、活鎖/死鎖風險、跨平台行為差異。核心原則:絕不想當然,所有共享訪問必須同步。

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