Java多線程併發面試問答

原文鏈接:https://mp.weixin.qq.com/s/a1cQIJMINpkmY8WBULsYWw

Java併發面試問答

什麼是原子操作?Java併發API中的原子類是什麼?

原子操作在單個任務單元中執行,而不受其他操作的干擾。在多線程環境中,原子操作是必需的,以避免數據不一致。

int++不是原子操作。因此,當一個線程讀取其值並將其遞增1時,另一線程讀取了較早的值,從而導致錯誤的結果。

爲了解決這個問題,我們必須確保對count的增量操作是原子的,我們可以使用Synchronization做到這一點,但是Java 5 java.util.concurrent.atomic爲int和long提供了包裝器類,可用於自動實現此目的不使用同步。

Java併發API中的Lock接口是什麼?與同步相比,它有什麼好處?

與使用同步方法和同步塊相比,Lock接口提供了更廣泛的鎖定操作。它們允許更靈活的結構,可以具有完全不同的屬性,並且可以支持多個關聯的Condition對象。
鎖的優點是

  • 有可能使它們公平
  • 在等待Lock對象時,可以使線程響應中斷。
  • 可以嘗試獲取鎖,但是如果無法獲取鎖,則立即返回或在超時後返回
  • 可以在不同的範圍內以不同的順序獲取和釋放鎖

什麼是Executor框架?

在Java 5中,Executor框架是通過java.util.concurrent.Executor接口引入的。

Executor框架是用於根據一組執行策略對異步任務的調用,調度,執行和控制進行標準化的框架。

創建很多沒有最大閾值限制的線程會導致應用程序用盡堆內存。因此,創建ThreadPool是更好的解決方案,因爲可以合併和重用有限數量的線程。執行程序框架簡化了用Java創建線程池的過程。

什麼是BlockingQueue?我們如何使用阻塞隊列來實現生產者-消費者問題?

java.util.concurrent.BlockingQueue是一個Queue,它支持以下操作:在檢索和刪除元素時等待隊列變爲非空,並在添加元素時等待隊列中的空間變爲可用。

如果嘗試將空值存儲在隊列中,則BlockingQueue不接受空值並拋出NullPointerException。

BlockingQueue實現是線程安全的。所有排隊方法本質上都是原子的,並使用內部鎖或其他形式的併發控制。

BlockingQueue接口是Java集合框架的一部分,它主要用於實現生產者-消費者問題。

什麼是Callable和Future?

Java 5在併發包中引入了java.util.concurrent.Callable接口,該接口類似於Runnable接口,但是它可以返回任何Object並能夠引發Exception。

Callable接口使用泛型定義Object的返回類型。Executors類提供有用的方法來在線程池中執行Callable。由於可調用任務並行運行,因此我們必須等待返回的Object。可調用任務返回java.util.concurrent.Future對象。使用Future,我們可以找出Callable任務的狀態並獲取返回的Object。它提供了get()方法,可以等待Callable完成,然後返回結果。

什麼是FutureTask類?

FutureTask是Future接口的基本實現類,我們可以將其與Executors一起使用以進行異步處理。在大多數情況下,我們不需要使用FutureTask類,但是如果我們要覆蓋Future接口的某些方法並希望保留大多數基本實現,它將非常方便。我們可以擴展此類並根據我們的要求覆蓋方法。

什麼是併發集合類?

Java Collection類是fast-fail的,這意味着如果在使用迭代器遍歷某個線程的同時更改了Collection,則iterator.next()將拋出ConcurrentModificationException。

併發集合類支持檢索的完全併發性和可調整的預期更新併發性。
主要類是ConcurrentHashMap,CopyOnWriteArrayList和CopyOnWriteArraySet。

什麼是Executors類?

Executors類爲Executor,ExecutorService,ScheduledExecutorService,ThreadFactory和Callable類提供實用程序方法。

Executors類可用於在Java中輕鬆創建線程池,這也是唯一支持執行Callable實現的類。

Java 8中的併發API有哪些改進?

一些重要的併發API增強功能包括:

  • ConcurrentHashMapcompute(),forEach(),forEachEntry(),forEachKey(),forEachValue(),merge(),reduce()和search()方法。
  • 可以顯式完成的CompletableFuture(設置其值和狀態)。
  • 執行程序newWorkStealingPool()方法使用所有可用處理器作爲目標並行度來創建竊取線程池。

“不積跬步,無以至千里”,希望未來的你能:有夢爲馬 隨處可棲!加油,少年!

關注公衆號:「Java 知己」,每天更新Java知識哦,期待你的到來!

  • 發送「Group」,與 10 萬程序員一起進步。
  • 發送「面試」,領取BATJ面試資料、面試視頻攻略。
  • 發送「玩轉算法」,領取《玩轉算法》系列視頻教程。
  • 千萬不要發送「1024」…

每日福利
每日福利

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章