1.執行緒狀態
請解釋 Java 中執行緒的幾種狀態,並描述每種狀態的特點和轉換條件。
NEW
(新建):執行緒被建立,但尚未啟動。RUNNABLE
(可執行):執行緒正在執行,可能在執行程式碼,也可能等待作業系統資源。BLOCKED
(阻塞):執行緒在等待監視器鎖,以便進入同步塊/方法。WAITING
(等待):執行緒等待另一個執行緒顯式地喚醒它(例如,Object.wait()
,Thread.join()
)。TIMED_WAITING
(計時等待):執行緒等待另一個執行緒在指定的時間內喚醒它(例如,Thread.sleep()
,Object.wait(long timeout)
)。TERMINATED
(終止):執行緒已完成執行。
執行緒狀態的轉換條件包括執行緒的啟動、資源競爭、同步塊/方法的進入與退出、以及超時等。
2.synchronized 和 ReentrantLock
synchronized
和ReentrantLock
有什麼區別?在什麼情況下會選擇使用ReentrantLock
?
synchronized
:是Java中的內建同步機制,修飾方法
或程式碼塊
,使用物件內部的監視器鎖。簡單易用,但功能有限(如不能嘗試鎖定、不能定時鎖定)。ReentrantLock
:是java.util.concurrent.locks
包中的鎖,具有更多的高階功能,如可重入、可定時、可中斷
的鎖定方式,支援公平鎖和非公平鎖
。
選擇 ReentrantLock
的情況:
- 需要嘗試鎖定或定時鎖定。
- 需要公平鎖定(順序鎖定)。
- 需要更靈活的鎖定機制和條件變數(例如
Condition
)。
3.執行緒池
請說明
ThreadPoolExecutor
類的核心引數及其作用。你會如何調整執行緒池的配置來應對高併發的需求?
ThreadPoolExecutor
類的核心引數:
corePoolSize
:核心執行緒數,執行緒池中始終保持存活的執行緒數。maximumPoolSize
:最大執行緒數,執行緒池中允許的最大執行緒數。keepAliveTime
:執行緒空閒時間,當執行緒數超過 corePoolSize 時,超時未任務的執行緒會被終止。unit
:keepAliveTime 的時間單位。workQueue
:任務佇列,儲存等待執行的任務。threadFactory
:執行緒工廠,建立新執行緒的方式。handler
:拒絕策略,當任務無法提交到執行緒池時的處理方式。
高併發配置建議:
- 根據任務型別調整 corePoolSize 和 maximumPoolSize。
- 選擇合適的佇列(有界/無界)避免資源耗盡。
- 使用合適的拒絕策略(如
CallerRunsPolicy
)以防止任務丟失。
4.Future 和 CompletableFuture
Future
和CompletableFuture
有何區別?在什麼情況下你會選擇使用CompletableFuture
?
Future
:表示一個非同步計算的結果,可以透過get()
方法獲取計算結果,但會阻塞
直到任務完成。適用於簡單的非同步任務。CompletableFuture
:擴充套件了Future
,提供了更豐富的 API 來進行非同步任務的組合和處理(如thenApply
、thenAccept
)。支援鏈式呼叫和異常處理
。
使用 CompletableFuture
的情況:
- 需要進行多個非同步任務的組合。
- 需要非阻塞地處理非同步結果。
- 需要處理非同步計算的異常。
5.阻塞佇列
請介紹幾種常用的阻塞佇列及其適用場景。
常用的阻塞佇列:
ArrayBlockingQueue
:基於陣列的有界阻塞佇列。LinkedBlockingQueue
:基於連結串列的有界或無界阻塞佇列。PriorityBlockingQueue
:支援優先順序排序的無界阻塞佇列。DelayQueue
:支援延時獲取元素的無界阻塞佇列。SynchronousQueue
:不儲存元素的佇列,每個插入操作必須等待對應的移除操作。
適用場景:
- ArrayBlockingQueue:固定容量的場景,避免佇列過大。
- LinkedBlockingQueue:需要動態增長的佇列長度場景。
- PriorityBlockingQueue:需要優先順序處理的場景。
- DelayQueue:需要延遲執行的任務排程場景。
- SynchronousQueue:生產者和消費者一對一互動的場景。
6.CAS
什麼是 CAS(Compare-And-Swap)?它是如何在 Java 中實現的?請描述其優缺點。
CAS(Compare-And-Swap)
:
- CAS 是一種無鎖演算法,用於實現
原子操作
。透過比較記憶體中的某個值與預期值,如果相同則修改成新值,否則不修改。 - 在 Java 中,CAS 透過
sun.misc.Unsafe
類中的方法實現(如compareAndSwapInt
)。
優點:
- 高效,無需阻塞執行緒。
- 適合在多執行緒環境下保證資料一致性。
缺點:
- 可能會導致忙等待(如果 CAS 操作頻繁失敗)。
- 不適合複雜的同步場景(如需要維護多個變數的一致性)。