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」…
每日福利