一、進程:資源分配的基本單位
定義:進程是正在運行的程序實例。每個進程擁有獨立的內存空間(代碼區、堆、棧、數據區)和系統資源(文件句柄、網絡端口、鎖等)。
任務管理器視角:每一行就是一個進程(chrome.exe、java.exe、idea64.exe...)。
多進程意義
- 實現多任務:一邊聽歌(音樂進程)、一邊寫代碼(IDE進程)、一邊編譯(編譯器進程)
- 提高 CPU 利用率:單核 CPU 通過時間片輪轉「偽並行」,多核 CPU 真並行
二、線程:CPU 調度的基本單位
定義:線程是進程內的一條執行路徑。同一進程內的多線程共享進程的堆、方法區、文件句柄,但各自擁有獨立的程序計數器、虛擬機棧、本地方法棧。
| 維度 | 進程 | 線程 |
| 資源擁有 | 獨立地址空間 | 共享進程資源,僅私有棧/PC寄存器 |
| 切換開銷 | 大(需切換地址空間、TLB刷新) | 小(僅切換棧幀、寄存器) |
| 通信方式 | IPC(管道、Socket、共享內存) | 直接讀寫共享變量(需同步) |
| 崩潰影響 | 隔離 | 一線程崩潰可導致整進程退出 |
多線程意義
- 非為提高單任務速度(上下文切換有開銷)
- 為提高應用吞吐率:I/O 密集型任務中,線程阻塞時 CPU 可執行其他線程
- 搶佔式調度:執行順序具有隨機性
三、並行 vs 並發:一圖勝千言
- 並發:邏輯上「同時」發生。單核 CPU 通過時間片快速切換多線程,宏觀上看起來在同時運行。
- 並行:物理上「同時」發生。多核 CPU 真正同一時刻執行多線程。
關係:並行是並發的一種理想實現;Java 多線程程序在單核上是並發,在多核上可達到並行。
四、Java 程序運行原理與 JVM 線程模型
啟動流程
java MainClass 命令啟動 JVM 進程
- JVM 創建主線程(main thread)
- 主線程調用
public static void main(String[] args)
思考題:JVM 啟動是單線程還是多線程?
答案:多線程
原因:除主線程外,JVM 內部至少還會啟動:
- GC 線程:垃圾回收(若不先啟動,堆內存分配極易 OOM)
- Finalizer 線程:處理
finalize() 隊列
- Reference Handler:處理軟/弱/虛引用
- Signal Dispatcher:處理系統信號
- JIT 編譯線程(C1/C2 CompilerThread)
可通過 jstack pid 或 VisualVM 觀察到 10+ 守護線程已在運行。
五、核心知識點速記卡
- 進程 = 資源容器,線程 = 執行單元
- 並發 ≠ 並行,單核只能並發
- 多線程 ≠ 更快,上下文切換有代價,I/O 密集型收益大,CPU 密集型可能更慢
- JVM 啟動即多線程,main 只是用戶代碼入口
- 線程安全:共享可變狀態需同步(synchronized、Lock、原子類、ThreadLocal)
理解這些基石概念,是掌握 JUC 並發包、線程池、鎖優化、無鎖編程等進階主題的前提。