1. 程式人生 > >最強Java併發程式設計詳解:知識點梳理,BAT面試題等

最強Java併發程式設計詳解:知識點梳理,BAT面試題等

本文原創,更多內容可以參考: Java 全棧知識體系。如需轉載請說明原處。

知識體系系統性梳理

Java 併發之基礎

A. Java進階 - Java 併發之基礎:首先全域性的瞭解併發的知識體系,同時瞭解併發理論基礎和執行緒基礎,併發關鍵字等,這些是你理解Java併發框架的基礎。@pdai

  • Java 併發 - 知識體系
  • Java 併發 - 理論基礎
    • 多執行緒的出現是要解決什麼問題的?
    • 執行緒不安全是指什麼?舉例說明
    • 併發出現執行緒不安全的本質什麼?可見性,原子性和有序性。
    • Java是怎麼解決併發問題的?3個關鍵字,JMM和8個Happens-Before
    • 執行緒安全是不是非真即假?不是
    • 執行緒安全有哪些實現思路?
    • 如何理解併發和並行的區別?
  • Java 併發 - 執行緒基礎
    • 執行緒有哪幾種狀態?分別說明從一種狀態到另一種狀態轉變有哪些方式?
    • 通常執行緒有哪幾種使用方式?
    • 基礎執行緒機制有哪些?
    • 執行緒的中斷方式有哪些?
    • 執行緒的互斥同步方式有哪些?如何比較和選擇?
    • 執行緒之間有哪些協作方式?

併發關鍵字:volatile,final,synchronized

  • 關鍵字: synchronized詳解
    • Synchronized可以作用在哪裡?分別通過物件鎖和類鎖進行舉例。
    • Synchronized本質上是通過什麼保證執行緒安全的?分三個方面回答:加鎖和釋放鎖的原理,可重入原理,保證可見性原理。
    • Synchronized由什麼樣的缺陷? Java Lock是怎麼彌補這些缺陷的。
    • Synchronized和Lock的對比,和選擇?
    • Synchronized在使用時有何注意事項?
    • Synchronized修飾的方法在丟擲異常時,會釋放鎖嗎?
    • 多個執行緒等待同一個snchronized鎖的時候,JVM如何選擇下一個獲取鎖的執行緒?
    • Synchronized使得同時只有一個執行緒可以執行,效能比較差,有什麼提升的方法?
    • 我想更加靈活地控制鎖的釋放和獲取(現在釋放鎖和獲取鎖的時機都被規定死了),怎麼辦?
    • 什麼是鎖的升級和降級?什麼是JVM裡的偏斜鎖、輕量級鎖、重量級鎖?
    • 不同的JDK中對Synchronized有何優化?
  • 關鍵字: volatile詳解
    • volatile關鍵字的作用是什麼?
    • volatile能保證原子性嗎?
    • 之前32位機器上共享的long和double變數的為什麼要用volatile?現在64位機器上是否也要設定呢?
    • i++為什麼不能保證原子性?
    • volatile是如何實現可見性的? 記憶體屏障。
    • volatile是如何實現有序性的? happens-before等
    • 說下volatile的應用場景?
  • 關鍵字: final詳解
    • 所有的final修飾的欄位都是編譯期常量嗎?
    • 如何理解private所修飾的方法是隱式的final?
    • 說說final型別的類如何拓展?比如String是final型別,我們想寫個MyString複用所有String中方法,同時增加一個新的toMyString()的方法,應該如何做?
    • final方法可以被過載嗎?可以
    • 父類的final方法能不能夠被子類重寫?不可以
    • 說說final域重排序規則?
    • 說說final的原理?
    • 使用 final 的限制條件和侷限性?
    • 看本文最後的一個思考題

J.U.C框架

Lock框架和Tools類

類結構總覽

介面: Condition

Condition為介面型別,它將 Object 監視器方法(wait、notify 和 notifyAll)分解成截然不同的物件,以便通過將這些物件與任意 Lock 實現組合使用,為每個物件提供多個等待 set (wait-set)。其中,Lock 替代了 synchronized 方法和語句的使用,Condition 替代了 Object 監視器方法的使用。可以通過await(),signal()來休眠/喚醒執行緒。

在JUC鎖: AbstractQueuedSynchonizer詳解中類的內部類-conditionobject類有具體分析。

介面: Lock

Lock為介面型別,Lock實現提供了比使用synchronized方法和語句可獲得的更廣泛的鎖定操作。此實現允許更靈活的結構,可以具有差別很大的屬性,可以支援多個相關的Condition物件。

介面: ReadWriteLock

ReadWriteLock為介面型別, 維護了一對相關的鎖,一個用於只讀操作,另一個用於寫入操作。只要沒有 writer,讀取鎖可以由多個 reader 執行緒同時保持。寫入鎖是獨佔的。

抽象類: AbstractOwnableSynchonizer

AbstractOwnableSynchonizer為抽象類,可以由執行緒以獨佔方式擁有的同步器。此類為建立鎖和相關同步器(伴隨著所有權的概念)提供了基礎。AbstractOwnableSynchronizer 類本身不管理或使用此資訊。但是,子類和工具可以使用適當維護的值幫助控制和監視訪問以及提供診斷。

抽象類(long): AbstractQueuedLongSynchronizer

AbstractQueuedLongSynchronizer為抽象類,以 long 形式維護同步狀態的一個 AbstractQueuedSynchronizer 版本。此類具有的結構、屬性和方法與 AbstractQueuedSynchronizer 完全相同,但所有與狀態相關的引數和結果都定義為 long 而不是 int。當建立需要 64 位狀態的多級別鎖和屏障等同步器時,此類很有用。

核心抽象類(int): AbstractQueuedSynchonizer

AbstractQueuedSynchonizer為抽象類,其為實現依賴於先進先出 (FIFO) 等待佇列的阻塞鎖和相關同步器(訊號量、事件,等等)提供一個框架。此類的設計目標是成為依靠單個原子 int 值來表示狀態的大多數同步器的一個有用基礎。

詳細分析請看: JUC鎖: AbstractQueuedSynchonizer詳解

鎖常用類: LockSupport

LockSupport為常用類,用來建立鎖和其他同步類的基本執行緒阻塞原語。LockSupport的功能和"Thread中的 Thread.suspend()和Thread.resume()有點類似",LockSupport中的park() 和 unpark() 的作用分別是阻塞執行緒和解除阻塞執行緒。但是park()和unpark()不會遇到“Thread.suspend 和 Thread.resume所可能引發的死鎖”問題。

詳細分析請看: JUC鎖: LockSupport詳解

鎖常用類: ReentrantLock

ReentrantLock為常用類,它是一個可重入的互斥鎖 Lock,它具有與使用 synchronized 方法和語句所訪問的隱式監視器鎖相同的一些基本行為和語義,但功能更強大。

詳細分析請看: JUC鎖: ReentrantLock詳解

鎖常用類: ReentrantReadWriteLock

ReentrantReadWriteLock是讀寫鎖介面ReadWriteLock的實現類,它包括Lock子類ReadLock和WriteLock。ReadLock是共享鎖,WriteLock是獨佔鎖。

詳細分析請看: JUC工具類: ReentrantReadWriteLock詳解

鎖常用類: StampedLock

它是java8在java.util.concurrent.locks新增的一個API。StampedLock控制鎖有三種模式(寫,讀,樂觀讀),一個StampedLock狀態是由版本和模式兩個部分組成,鎖獲取方法返回一個數字作為票據stamp,它用相應的鎖狀態表示並控制訪問,數字0表示沒有寫鎖被授權訪問。在讀鎖上分為悲觀鎖和樂觀鎖。

詳細分析請看: Java 8 - StampedLock詳解

工具常用類: CountDownLatch

CountDownLatch為常用類,它是一個同步輔助類,在完成一組正在其他執行緒中執行的操作之前,它允許一個或多個執行緒一直等待。

詳細分析請看: JUC工具類: CountDownLatch詳解

工具常用類: CyclicBarrier

CyclicBarrier為常用類,其是一個同步輔助類,它允許一組執行緒互相等待,直到到達某個公共屏障點 (common barrier point)。在涉及一組固定大小的執行緒的程式中,這些執行緒必須不時地互相等待,此時 CyclicBarrier 很有用。因為該 barrier 在釋放等待執行緒後可以重用,所以稱它為迴圈 的 barrier。

詳細分析請看: JUC工具類: CyclicBarrier詳解

工具常用類: Phaser

Phaser是JDK 7新增的一個同步輔助類,它可以實現CyclicBarrier和CountDownLatch類似的功能,而且它支援對任務的動態調整,並支援分層結構來達到更高的吞吐量。

詳細分析請看: JUC工具類: Phaser詳解

工具常用類: Semaphore

Semaphore為常用類,其是一個計數訊號量,從概念上講,訊號量維護了一個許可集。如有必要,在許可可用前會阻塞每一個 acquire(),然後再獲取該許可。每個 release() 新增一個許可,從而可能釋放一個正在阻塞的獲取者。但是,不使用實際的許可物件,Semaphore 只對可用許可的號碼進行計數,並採取相應的行動。通常用於限制可以訪問某些資源(物理或邏輯的)的執行緒數目。

詳細分析請看: JUC工具類: Semaphore詳解

工具常用類: Exchanger

Exchanger是用於執行緒協作的工具類, 主要用於兩個執行緒之間的資料交換。它提供一個同步點,在這個同步點,兩個執行緒可以交換彼此的資料。這兩個執行緒通過exchange()方法交換資料,當一個執行緒先執行exchange()方法後,它會一直等待第二個執行緒也執行exchange()方法,當這兩個執行緒到達同步點時,這兩個執行緒就可以交換資料了。

詳細分析請看: JUC工具類: Exchanger詳解

Collections: 併發集合

類結構關係

Queue: ArrayBlockingQueue

一個由陣列支援的有界阻塞佇列。此佇列按 FIFO(先進先出)原則對元素進行排序。佇列的頭部 是在佇列中存在時間最長的元素。佇列的尾部 是在佇列中存在時間最短的元素。新元素插入到佇列的尾部,佇列獲取操作則是從佇列頭部開始獲得元素。

詳細分析請看: JUC併發集合: BlockingQueue詳解

Queue: LinkedBlockingQueue

一個基於已連結節點的、範圍任意的 blocking queue。此佇列按 FIFO(先進先出)排序元素。佇列的頭部 是在佇列中時間最長的元素。佇列的尾部 是在佇列中時間最短的元素。新元素插入到佇列的尾部,並且佇列獲取操作會獲得位於佇列頭部的元素。連結佇列的吞吐量通常要高於基於陣列的佇列,但是在大多數併發應用程式中,其可預知的效能要低。

詳細分析請看: JUC併發集合: BlockingQueue詳解

Queue: LinkedBlockingDeque

一個基於已連結節點的、任選範圍的阻塞雙端佇列。

詳細分析請看: JUC併發集合: BlockingQueue詳解

Queue: ConcurrentLinkedQueue

一個基於連結節點的無界執行緒安全佇列。此佇列按照 FIFO(先進先出)原則對元素進行排序。佇列的頭部 是佇列中時間最長的元素。佇列的尾部 是佇列中時間最短的元素。新的元素插入到佇列的尾部,佇列獲取操作從佇列頭部獲得元素。當多個執行緒共享訪問一個公共 collection 時,ConcurrentLinkedQueue 是一個恰當的選擇。此佇列不允許使用 null 元素。

詳細分析請看: JUC併發集合: ConcurrentLinkedQueue詳解

Queue: ConcurrentLinkedDeque

是雙向連結串列實現的無界佇列,該佇列同時支援FIFO和FILO兩種操作方式。

Queue: DelayQueue

延時無界阻塞佇列,使用Lock機制實現併發訪問。佇列裡只允許放可以“延期”的元素,佇列中的head是最先“到期”的元素。如果隊裡中沒有元素到“到期”,那麼就算佇列中有元素也不能獲取到。

Queue: PriorityBlockingQueue

無界優先順序阻塞佇列,使用Lock機制實現併發訪問。priorityQueue的執行緒安全版,不允許存放null值,依賴於comparable的排序,不允許存放不可比較的物件型別。

Queue: SynchronousQueue

沒有容量的同步佇列,通過CAS實現併發訪問,支援FIFO和FILO。

Queue: LinkedTransferQueue

JDK 7新增,單向連結串列實現的無界阻塞佇列,通過CAS實現併發訪問,佇列元素使用 FIFO(先進先出)方式。LinkedTransferQueue可以說是ConcurrentLinkedQueue、SynchronousQueue(公平模式)和LinkedBlockingQueue的超集, 它不僅僅綜合了這幾個類的功能,同時也提供了更高效的實現。

List: CopyOnWriteArrayList

ArrayList 的一個執行緒安全的變體,其中所有可變操作(add、set 等等)都是通過對底層陣列進行一次新的複製來實現的。這一般需要很大的開銷,但是當遍歷操作的數量大大超過可變操作的數量時,這種方法可能比其他替代方法更 有效。在不能或不想進行同步遍歷,但又需要從併發執行緒中排除衝突時,它也很有用。

詳細分析請看: JUC併發集合: CopyOnWriteArrayList詳解

Set: CopyOnWriteArraySet

對其所有操作使用內部CopyOnWriteArrayList的Set。即將所有操作轉發至CopyOnWriteArayList來進行操作,能夠保證執行緒安全。在add時,會呼叫addIfAbsent,由於每次add時都要進行陣列遍歷,因此效能會略低於CopyOnWriteArrayList。

Set: ConcurrentSkipListSet

一個基於ConcurrentSkipListMap 的可縮放併發 NavigableSet 實現。set 的元素可以根據它們的自然順序進行排序,也可以根據建立 set 時所提供的 Comparator 進行排序,具體取決於使用的構造方法。

Map: ConcurrentHashMap

是執行緒安全HashMap的。ConcurrentHashMap在JDK 7之前是通過Lock和segment(分段鎖)實現,JDK 8 之後改為CAS+synchronized來保證併發安全。

詳細分析請看: JUC併發集合: ConcurrentHashMap詳解, 包含了對JDK 7和JDK 8版本的原始碼分析。

Map: ConcurrentSkipListMap

執行緒安全的有序的雜湊表(相當於執行緒安全的TreeMap);對映可以根據鍵的自然順序進行排序,也可以根據建立對映時所提供的 Comparator 進行排序,具體取決於使用的構造方法。

Atomic: 原子類

其基本的特性就是在多執行緒環境下,當有多個執行緒同時執行這些類的例項包含的方法時,具有排他性,即當某個執行緒進入方法,執行其中的指令時,不會被其他執行緒打斷,而別的執行緒就像自旋鎖一樣,一直等到該方法執行完成,才由JVM從等待佇列中選擇一個另一個執行緒進入,這只是一種邏輯上的理解。實際上是藉助硬體的相關指令來實現的,不會阻塞執行緒(或者說只是在硬體級別上阻塞了)。

對CAS,Unsafe類,以及13個原子類詳解請參考:詳細分析請看: JUC原子類: CAS, Unsafe和原子類詳解

基礎型別:AtomicBoolean,AtomicInteger,AtomicLong

AtomicBoolean,AtomicInteger,AtomicLong是類似的,分別針對bool,interger,long的原子類。

陣列:AtomicIntegerArray,AtomicLongArray,BooleanArray

AtomicIntegerArray,AtomicLongArray,AtomicBooleanArray是陣列原子類。

引用:AtomicReference,AtomicMarkedReference,AtomicStampedReference

AtomicReference,AtomicMarkedReference,AtomicStampedReference是引用相關的原子類。

FieldUpdater:AtomicLongFieldUpdater,AtomicIntegerFieldUpdater,AtomicReferenceFieldUpdater

AtomicLongFieldUpdater,AtomicIntegerFieldUpdater,AtomicReferenceFieldUpdater是FieldUpdater原子類。

Executors: 執行緒池

類結構關係

介面: Executor

Executor介面提供一種將任務提交與每個任務將如何執行的機制(包括執行緒使用的細節、排程等)分離開來的方法。通常使用 Executor 而不是顯式地建立執行緒。

ExecutorService

ExecutorService繼承自Executor介面,ExecutorService提供了管理終止的方法,以及可為跟蹤一個或多個非同步任務執行狀況而生成 Future 的方法。 可以關閉 ExecutorService,這將導致其停止接受新任務。關閉後,執行程式將最後終止,這時沒有任務在執行,也沒有任務在等待執行,並且無法提交新任務。

ScheduledExecutorService

ScheduledExecutorService繼承自ExecutorService介面,可安排在給定的延遲後執行或定期執行的命令。

AbstractExecutorService

AbstractExecutorService繼承自ExecutorService介面,其提供 ExecutorService 執行方法的預設實現。此類使用 newTaskFor 返回的 RunnableFuture 實現 submit、invokeAny 和 invokeAll 方法,預設情況下,RunnableFuture 是此包中提供的 FutureTask 類。

FutureTask

FutureTask 為 Future 提供了基礎實現,如獲取任務執行結果(get)和取消任務(cancel)等。如果任務尚未完成,獲取任務執行結果時將會阻塞。一旦執行結束,任務就不能被重啟或取消(除非使用runAndReset執行計算)。FutureTask 常用來封裝 Callable 和 Runnable,也可以作為一個任務提交到執行緒池中執行。除了作為一個獨立的類之外,此類也提供了一些功能性函式供我們建立自定義 task 類使用。FutureTask 的執行緒安全由CAS來保證。

詳細分析請看: JUC執行緒池: FutureTask詳解

核心: ThreadPoolExecutor

ThreadPoolExecutor實現了AbstractExecutorService介面,也是一個 ExecutorService,它使用可能的幾個池執行緒之一執行每個提交的任務,通常使用 Executors 工廠方法配置。 執行緒池可以解決兩個不同問題: 由於減少了每個任務呼叫的開銷,它們通常可以在執行大量非同步任務時提供增強的效能,並且還可以提供繫結和管理資源(包括執行任務集時使用的執行緒)的方法。每個 ThreadPoolExecutor 還維護著一些基本的統計資料,如完成的任務數。

詳細分析請看: JUC執行緒池: ThreadPoolExecutor詳解

核心: ScheduledThreadExecutor

ScheduledThreadPoolExecutor實現ScheduledExecutorService介面,可安排在給定的延遲後執行命令,或者定期執行命令。需要多個輔助執行緒時,或者要求 ThreadPoolExecutor 具有額外的靈活性或功能時,此類要優於 Timer。

詳細分析請看: JUC執行緒池: ScheduledThreadExecutor詳解

核心: Fork/Join框架

ForkJoinPool 是JDK 7加入的一個執行緒池類。Fork/Join 技術是分治演算法(Divide-and-Conquer)的並行實現,它是一項可以獲得良好的並行效能的簡單且高效的設計技術。目的是為了幫助我們更好地利用多處理器帶來的好處,使用所有可用的運算能力來提升應用的效能。

詳細分析請看: JUC執行緒池: Fork/Join框架詳解

工具類: Executors

Executors是一個工具類,用其可以建立ExecutorService、ScheduledExecutorService、ThreadFactory、Callable等物件。它的使用融入到了ThreadPoolExecutor, ScheduledThreadExecutor和ForkJoinPool中。

J.U.C框架重點面試題詳解

B. Java進階 - Java 併發之J.U.C框架:然後需要對J.U.C框架五大類詳細解讀,包括:Lock框架,併發集合, 原子類, 執行緒池和工具類。@pdai

  • JUC - 類彙總和學習指南
    • JUC框架包含幾個部分?
    • 每個部分有哪些核心的類?
    • 最最核心的類有哪些?

J.U.C框架【1/5】:CAS及原子類

B.1 Java進階 - Java 併發之J.U.C框架【1/5】:CAS及原子類:從最核心的CAS, Unsafe和原子類開始分析。

  • JUC原子類: CAS, Unsafe和原子類詳解
    • 執行緒安全的實現方法有哪些?
    • 什麼是CAS?
    • CAS使用示例,結合AtomicInteger給出示例?
    • CAS會有哪些問題?
    • 針對這這些問題,Java提供了哪幾個解決的?
    • AtomicInteger底層實現?CAS+volatile
    • 請闡述你對Unsafe類的理解?
    • 說說你對Java原子類的理解?包含13個,4組分類,說說作用和使用場景。
    • AtomicStampedReference是什麼?
    • AtomicStampedReference是怎麼解決ABA的?內部使用Pair來儲存元素值及其版本號
    • java中還有哪些類可以解決ABA的問題?AtomicMarkableReference

J.U.C框架【2/5】:鎖

B.2 Java進階 - Java 併發之J.U.C框架【2/5】:鎖:然後分析JUC中鎖。

  • JUC鎖: LockSupport詳解
    • 為什麼LockSupport也是核心基礎類?AQS框架藉助於兩個類:Unsafe(提供CAS操作)和LockSupport(提供park/unpark操作)
    • 寫出分別通過wait/notify和LockSupport的park/unpark實現同步?
    • LockSupport.park()會釋放鎖資源嗎?那麼Condition.await()呢?
    • Thread.sleep()、Object.wait()、Condition.await()、LockSupport.park()的區別?重點
    • 如果在wait()之前執行了notify()會怎樣?
    • 如果在park()之前執行了unpark()會怎樣?
  • JUC鎖: 鎖核心類AQS詳解
    • 什麼是AQS?為什麼它是核心?
    • AQS的核心思想是什麼?它是怎麼實現的?底層資料結構等
    • AQS有哪些核心的方法?
    • AQS定義什麼樣的資源獲取方式?AQS定義了兩種資源獲取方式:獨佔(只有一個執行緒能訪問執行,又根據是否按佇列的順序分為公平鎖非公平鎖,如ReentrantLock) 和共享(多個執行緒可同時訪問執行,如SemaphoreCountDownLatchCyclicBarrier )。ReentrantReadWriteLock可以看成是組合式,允許多個執行緒同時對某一資源進行讀。
    • AQS底層使用了什麼樣的設計模式?模板
    • AQS的應用示例?
  • JUC鎖: ReentrantLock詳解
    • 什麼是可重入,什麼是可重入鎖?它用來解決什麼問題?
    • ReentrantLock的核心是AQS,那麼它怎麼來實現的,繼承嗎?說說其類內部結構關係。
    • ReentrantLock是如何實現公平鎖的?
    • ReentrantLock是如何實現非公平鎖的?
    • ReentrantLock預設實現的是公平還是非公平鎖?
    • 使用ReentrantLock實現公平和非公平鎖的示例?
    • ReentrantLock和Synchronized的對比?
  • JUC鎖: ReentrantReadWriteLock詳解
    • 為了有了ReentrantLock還需要ReentrantReadWriteLock?
    • ReentrantReadWriteLock底層實現原理?
    • ReentrantReadWriteLock底層讀寫狀態如何設計的?高16位為讀鎖,低16位為寫鎖
    • 讀鎖和寫鎖的最大數量是多少?
    • 本地執行緒計數器ThreadLocalHoldCounter是用來做什麼的?
    • 快取計數器HoldCounter是用來做什麼的?
    • 寫鎖的獲取與釋放是怎麼實現的?
    • 讀鎖的獲取與釋放是怎麼實現的?
    • RentrantReadWriteLock為什麼不支援鎖升級?
    • 什麼是鎖的升降級?RentrantReadWriteLock為什麼不支援鎖升級?

J.U.C框架【3/5】:集合

B.3 Java進階 - Java 併發之J.U.C框架【3/5】:集合:再理解JUC中重要的支援併發的集合。

  • JUC集合: ConcurrentHashMap詳解
    • 為什麼HashTable慢? 它的併發度是什麼?那麼ConcurrentHashMap併發度是什麼?
    • ConcurrentHashMap在JDK1.7和JDK1.8中實現有什麼差別?JDK1.8解決了JDK1.7中什麼問題
    • ConcurrentHashMap JDK1.7實現的原理是什麼?分段鎖機制
    • ConcurrentHashMap JDK1.8實現的原理是什麼?陣列+連結串列+紅黑樹,CAS
    • ConcurrentHashMap JDK1.7中Segment數(concurrencyLevel)預設值是多少?為何一旦初始化就不可再擴容?
    • ConcurrentHashMap JDK1.7說說其put的機制?
    • ConcurrentHashMap JDK1.7是如何擴容的?rehash(注:segment 陣列不能擴容,擴容是 segment 陣列某個位置內部的陣列 HashEntry<K,V>[] 進行擴容)
    • ConcurrentHashMap JDK1.8是如何擴容的?tryPresize
    • ConcurrentHashMap JDK1.8連結串列轉紅黑樹的時機是什麼?臨界值為什麼是8?
    • ConcurrentHashMap JDK1.8是如何進行資料遷移的?transfer
  • JUC集合: CopyOnWriteArrayList詳解
    • 請先說說非併發集合中Fail-fast機制?
    • 再為什麼說ArrayList查詢快而增刪慢?
    • 對比ArrayList說說CopyOnWriteArrayList的增刪改查實現原理? COW基於拷貝
    • 再說下弱一致性的迭代器原理是怎麼樣的?COWIterator<E>
    • CopyOnWriteArrayList為什麼併發安全且效能比Vector好?
    • CopyOnWriteArrayList有何缺陷,說說其應用場景?
  • JUC集合: ConcurrentLinkedQueue詳解
    • 要想用執行緒安全的佇列有哪些選擇?Vector,Collections.synchronizedList( List<T> list), ConcurrentLinkedQueue等
    • ConcurrentLinkedQueue實現的資料結構?
    • ConcurrentLinkedQueue底層原理? 全程無鎖(CAS)
    • ConcurrentLinkedQueue的核心方法有哪些?offer(),poll(),peek(),isEmpty()等佇列常用方法
    • 說說ConcurrentLinkedQueue的HOPS(延遲更新的策略)的設計?
    • ConcurrentLinkedQueue適合什麼樣的使用場景?
  • JUC集合: BlockingQueue詳解
    • 什麼是BlockingDeque?
    • BlockingQueue大家族有哪些?ArrayBlockingQueue, DelayQueue, LinkedBlockingQueue, SynchronousQueue...
    • BlockingQueue適合用在什麼樣的場景?
    • BlockingQueue常用的方法?
    • BlockingQueue插入方法有哪些?這些方法(add(o),offer(o),put(o),offer(o, timeout, timeunit))的區別是什麼?
    • BlockingDeque 與BlockingQueue有何關係,請對比下它們的方法?
    • BlockingDeque適合用在什麼樣的場景?
    • BlockingDeque大家族有哪些?
    • BlockingDeque 與BlockingQueue實現例子?

J.U.C框架【4/5】:執行緒池

B.4 Java進階 - Java 併發之J.U.C框架【4/5】:執行緒池:再者分析JUC中非常常用的執行緒池等。

  • JUC執行緒池: FutureTask詳解
    • FutureTask用來解決什麼問題的?為什麼會出現?
    • FutureTask類結構關係怎麼樣的?
    • FutureTask的執行緒安全是由什麼保證的?
    • FutureTask結果返回機制?
    • FutureTask內部執行狀態的轉變?
    • FutureTask通常會怎麼用?舉例說明。
  • JUC執行緒池: ThreadPoolExecutor詳解
    • 為什麼要有執行緒池?
    • Java是實現和管理執行緒池有哪些方式? 請簡單舉例如何使用。
    • 為什麼很多公司不允許使用Executors去建立執行緒池?那麼推薦怎麼使用呢?
    • ThreadPoolExecutor有哪些核心的配置引數?請簡要說明
    • ThreadPoolExecutor可以建立哪是哪三種執行緒池呢?
    • 當佇列滿了並且worker的數量達到maxSize的時候,會怎麼樣?
    • 說說ThreadPoolExecutor有哪些RejectedExecutionHandler策略?預設是什麼策略?
    • 簡要說下執行緒池的任務執行機制?execute –> addWorker –>runworker (getTask)
    • 執行緒池中任務是如何提交的?
    • 執行緒池中任務是如何關閉的?
    • 在配置執行緒池的時候需要考慮哪些配置因素?
    • 如何監控執行緒池的狀態?
  • JUC執行緒池: ScheduledThreadPool詳解
    • ScheduledThreadPoolExecutor要解決什麼樣的問題?
    • ScheduledThreadPoolExecutor相比ThreadPoolExecutor有哪些特性?
    • ScheduledThreadPoolExecutor有什麼樣的資料結構,核心內部類和抽象類?
    • ScheduledThreadPoolExecutor有哪兩個關閉策略?區別是什麼?
    • ScheduledThreadPoolExecutor中scheduleAtFixedRate 和 scheduleWithFixedDelay區別是什麼?
    • 為什麼ThreadPoolExecutor 的調整策略卻不適用於 ScheduledThreadPoolExecutor?
    • Executors 提供了幾種方法來構造 ScheduledThreadPoolExecutor?
  • JUC執行緒池: Fork/Join框架詳解
    • Fork/Join主要用來解決什麼樣的問題?
    • Fork/Join框架是在哪個JDK版本中引入的?
    • Fork/Join框架主要包含哪三個模組?模組之間的關係是怎麼樣的?
    • ForkJoinPool類繼承關係?
    • ForkJoinTask抽象類繼承關係?在實際運用中,我們一般都會繼承 RecursiveTask 、RecursiveAction 或 CountedCompleter 來實現我們的業務需求,而不會直接繼承 ForkJoinTask 類。
    • 整個Fork/Join 框架的執行流程/執行機制是怎麼樣的?
    • 具體闡述Fork/Join的分治思想和work-stealing 實現方式?
    • 有哪些JDK原始碼中使用了Fork/Join思想?
    • 如何使用Executors工具類建立ForkJoinPool?
    • 寫一個例子: 用ForkJoin方式實現1+2+3+...+100000?
    • Fork/Join在使用時有哪些注意事項?結合JDK中的斐波那契數列例項具體說明。

J.U.C框架【5/5】:工具類

B.5 Java進階 - Java 併發之J.U.C框架【5/5】:工具類:最後來看下JUC中有哪些工具類,以及執行緒隔離術ThreadLocal。

  • JUC工具類: CountDownLatch詳解
    • 什麼是CountDownLatch?
    • CountDownLatch底層實現原理?
    • CountDownLatch一次可以喚醒幾個任務?多個
    • CountDownLatch有哪些主要方法?await(),countDown()
    • CountDownLatch適用於什麼場景?
    • 寫道題:實現一個容器,提供兩個方法,add,size 寫兩個執行緒,執行緒1新增10個元素到容器中,執行緒2實現監控元素的個數,當個數到5個時,執行緒2給出提示並結束? 使用CountDownLatch 代替wait notify 好處。
  • JUC工具類: CyclicBarrier詳解
    • 什麼是CyclicBarrier?
    • CyclicBarrier底層實現原理?
    • CountDownLatch和CyclicBarrier對比?
    • CyclicBarrier的核心函式有哪些?
    • CyclicBarrier適用於什麼場景?
  • JUC工具類: Semaphore詳解
    • 什麼是Semaphore?
    • Semaphore內部原理?
    • Semaphore常用方法有哪些?如何實現執行緒同步和互斥的?
    • Semaphore適合用在什麼場景?
    • 單獨使用Semaphore是不會使用到AQS的條件佇列?
    • Semaphore中申請令牌(acquire)、釋放令牌(release)的實現?
    • Semaphore初始化有10個令牌,11個執行緒同時各呼叫1次acquire方法,會發生什麼?
    • Semaphore初始化有10個令牌,一個執行緒重複呼叫11次acquire方法,會發生什麼?
    • Semaphore初始化有1個令牌,1個執行緒呼叫一次acquire方法,然後呼叫兩次release方法,之後另外一個執行緒呼叫acquire(2)方法,此執行緒能夠獲取到足夠的令牌並繼續執行嗎?
    • Semaphore初始化有2個令牌,一個執行緒呼叫1次release方法,然後一次性獲取3個令牌,會獲取到嗎?
  • JUC工具類: Phaser詳解
    • Phaser主要用來解決什麼問題?
    • Phaser與CyclicBarrier和CountDownLatch的區別是什麼?
    • 如果用CountDownLatch來實現Phaser的功能應該怎麼實現?
    • Phaser執行機制是什麼樣的?
    • 給一個Phaser使用的示例?
  • JUC工具類: Exchanger詳解
    • Exchanger主要解決什麼問題?
    • 對比SynchronousQueue,為什麼說Exchanger可被視為 SynchronousQueue 的雙向形式?
    • Exchanger在不同的JDK版本中實現有什麼差別?
    • Exchanger實現機制?
    • Exchanger已經有了slot單節點,為什麼會加入arena node陣列?什麼時候會用到陣列?
    • arena可以確保不同的slot在arena中是不會相沖突的,那麼是怎麼保證的呢?
    • 什麼是偽共享,Exchanger中如何體現的?
    • Exchanger實現舉例
  • Java 併發 - ThreadLocal詳解
    • 什麼是ThreadLocal?用來解決什麼問題的?
    • 說說你對ThreadLocal的理解
    • ThreadLocal是如何實現執行緒隔離的?
    • 為什麼ThreadLocal會造成記憶體洩露?如何解決
    • 還有哪些使用ThreadLocal的應用場景?

更多內容

最全的Java後端知識體系 https://www.pdai.tech, 每天更新中...。