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

Java 多線程高頻面試 15 題:從基礎到進階的完整答案版

     編輯:Java 相關知識

投行、大廠必考:線程創建、同步、鎖、JUC、JMM、死鎖、線程池全覆蓋

多線程是 Java 後端面試核心模塊。本文整理 15 道高頻題,提供標準答案、底層原理、代碼片段、避坑指南,並補充 11 道進階補充題,構建完整知識圖譜。

核心 15 題精選答案

  1. T1→T2→T3 順序執行:t1.start(); t1.join(); t2.start(); t2.join(); t3.start(); 或 CountDownLatch 鏈式。
  2. Lock vs synchronized:Lock 提供讀寫分離(ReentrantReadWriteLock)、可中斷(lockInterruptibly)、公平鎖、嘗試獲取(tryLock)、多條件(Condition)。緩存場景用 ReadWriteLock 或 StampedLock(樂觀讀)。
  3. wait vs sleep:wait() 釋放鎖、需在同步塊中、notify 喚醒;sleep() 持有鎖、靜態方法、時間到自醒。wait 用於線程協作,sleep 用於暫停。
  4. 手寫阻塞隊列:數組/鏈表 + ReentrantLock + 兩個 Condition(notFull/notEmpty),put()/take() 循環等待+單次喚醒。生產用 ArrayBlockingQueue。
  5. 生產者-消費者:同第 4 題,或 wait/notify 版、BlockingQueue 版、Semaphore 版。
  6. 死鎖代碼與排查:雙線程交叉持鎖 synchronized(A){synchronized(B){}} vs synchronized(B){synchronized(A){}}。排查:jstack 發現 BLOCKED、死鎖檢測;預防:固定鎖順序、tryLock(timeout)、LockSupport.parkNanos。
  7. 原子操作:不可分割的操作。JDK AtomicInteger (CAS)、LongAdder (分段計數)、synchronized、volatile (單次讀寫)。
  8. volatile 作用:可見性(立即刷新主存)、有序性(禁止指令重排)、不保證原子性(複合操作需鎖/CAS)。JMM happens-before 規則。
  9. 競態條件:多線程訪問共享數據、至少一個寫、無同步。檢測:jstack、ThreadSanitizer、壓測。解決:鎖、原子類、線程封閉、不可變對象。
  10. Thread Dump 分析:Linux kill -3 <pid>、Windows Ctrl+Break、jstack <pid>。關注:RUNNABLE(CPU 熱點)、BLOCKED(鎖競爭)、WAITING(條件等待)、死鎖標記。
  11. start() vs run():start() 創建新線程、異步執行 run();直接調用 run() 同步執行在當前線程,無新線程。
  12. 喚醒阻塞線程:IO 阻塞無法中斷(關閉 Socket/Channel);sleep/wait/join → interrupt() 拋 InterruptedException;LockSupport.park → unpark。
  13. CyclicBarrier vs CountDownLatch:前者可重用(reset())、攔截點阻塞、可執行屏障動作;後者一次性、計數歸零觸發、無屏障動作。
  14. 不可變對象:final 字段、無 setter、正確發布(無 this 逸出)。優點:線程安全、免鎖、安全發布、HashMap Key 安全。String、Integer、LocalDateTime 皆不可變。
  15. 常見併發問題:內存可見性、競態、死鎖、活鎖(tryLock 重試)、飢餓(公平鎖解決)、上下文切換開銷。

補充 11 題速答

題目核心點
綠色線程 vs 本地線程綠色:用戶態調度(早期 JVM);本地:OS 內核調度(現代 JVM)
線程 vs 進程進程:資源分配單位、獨立地址空間;線程:調度單位、共享進程資源
上下文切換保存/恢復 PCB(程序計數器、棧指針、寄存器)、切換頁表、刷新 TLB
死鎖 vs 活鎖 vs 饑餓死鎖:互等永久阻塞;活鎖:主動重試但無進展;飢餓:長期搶不到資源
線程調度算法時間片輪轉 + 優先級搶佔(OS 相關),Java 僅提示優先級
線程調度OS 內核調度器決定哪個線程獲得 CPU 時間片
非捕獲異常處理Thread.setDefaultUncaughtExceptionHandler、ThreadGroup.uncaughtException
線程組已棄用,結構脆弱、無實際隔離,用線程池替代
Executor 框架優勢生命週期管理、任務佇列、拒絕策略、監控、可調參數、分離提交/執行
Executor vs Executors前者介面;後者工廠類(newFixedThreadPool 等),阿里規範禁用工廠方法,自定義參數
定位高 CPU 線程top -H -p <pid> 獲取 LWP ID → printf "%x" LWP → jstack 找十六進制 nid

面試加分回答模板

// 題目:如何實現線程安全的單例?
// 回答要點:
// 1. 枚舉單例(最推薦,防反射/序列化破壞)
// 2. 靜態內部類(延遲加載、線程安全)
// 3. DCL + volatile(注意指令重排)
// 4. 說明為何懶漢同步方法效能差、饿漢可能浪費空間
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved