【面試實戰】# 併發程式設計

暴躁的菜鸡發表於2024-06-19

1.執行緒狀態

請解釋 Java 中執行緒的幾種狀態,並描述每種狀態的特點和轉換條件。

  • NEW(新建):執行緒被建立,但尚未啟動。
  • RUNNABLE(可執行):執行緒正在執行,可能在執行程式碼,也可能等待作業系統資源。
  • BLOCKED(阻塞):執行緒在等待監視器鎖,以便進入同步塊/方法。
  • WAITING(等待):執行緒等待另一個執行緒顯式地喚醒它(例如,Object.wait()Thread.join())。
  • TIMED_WAITING(計時等待):執行緒等待另一個執行緒在指定的時間內喚醒它(例如,Thread.sleep()Object.wait(long timeout))。
  • TERMINATED(終止):執行緒已完成執行。

執行緒狀態的轉換條件包括執行緒的啟動、資源競爭、同步塊/方法的進入與退出、以及超時等。

2.synchronized 和 ReentrantLock

synchronizedReentrantLock 有什麼區別?在什麼情況下會選擇使用 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

FutureCompletableFuture 有何區別?在什麼情況下你會選擇使用 CompletableFuture

  • Future:表示一個非同步計算的結果,可以透過 get() 方法獲取計算結果,但會阻塞直到任務完成。適用於簡單的非同步任務。
  • CompletableFuture:擴充套件了 Future,提供了更豐富的 API 來進行非同步任務的組合和處理(如 thenApplythenAccept)。支援鏈式呼叫和異常處理

使用 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 操作頻繁失敗)。
  • 不適合複雜的同步場景(如需要維護多個變數的一致性)。

相關文章