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

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

知識體系系統性梳理

Java 併發之基礎

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

  • 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類

類結構總覽

image

接口: Condition

Condition爲接口類型,它將 Object 監視器方法(wait、notify 和 notifyAll)分解成大相徑庭的對象,以便經過將這些對象與任意 Lock 實現組合使用,爲每一個對象提供多個等待 set (wait-set)。其中,Lock 替代了 synchronized 方法和語句的使用,Condition 替代了 Object 監視器方法的使用。能夠經過await(),signal()來休眠/喚醒線程。node

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: 併發集合

類結構關係

image

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

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, 天天更新中...

相關文章
相關標籤/搜索