最強Java并發(fā)編程詳解:知識點梳理,BAT面試題等

來源:cnblogs.com/pengdai/p/12026959.html
知識體系系統(tǒng)性梳理

Java 并發(fā)之基礎(chǔ)
A. Java進階 - Java 并發(fā)之基礎(chǔ):首先全局的了解并發(fā)的知識體系,同時了解并發(fā)理論基礎(chǔ)和線程基礎(chǔ),并發(fā)關(guān)鍵字等,這些是你理解Java并發(fā)框架的基礎(chǔ)。@pdai
Java 并發(fā) - 知識體系
Java 并發(fā) - 理論基礎(chǔ)
多線程的出現(xiàn)是要解決什么問題的?
線程不安全是指什么?舉例說明
并發(fā)出現(xiàn)線程不安全的本質(zhì)什么?可見性,原子性和有序性。
Java是怎么解決并發(fā)問題的?3個關(guān)鍵字,JMM和8個Happens-Before
線程安全是不是非真即假?不是
線程安全有哪些實現(xiàn)思路?
如何理解并發(fā)和并行的區(qū)別?
Java 并發(fā) - 線程基礎(chǔ)
線程有哪幾種狀態(tài)?分別說明從一種狀態(tài)到另一種狀態(tài)轉(zhuǎn)變有哪些方式?
通常線程有哪幾種使用方式?
基礎(chǔ)線程機制有哪些?
線程的中斷方式有哪些?
線程的互斥同步方式有哪些?如何比較和選擇?
線程之間有哪些協(xié)作方式?
并發(fā)關(guān)鍵字:volatile,final,synchronized
關(guān)鍵字: synchronized詳解
Synchronized可以作用在哪里?分別通過對象鎖和類鎖進行舉例。
Synchronized本質(zhì)上是通過什么保證線程安全的?分三個方面回答:加鎖和釋放鎖的原理,可重入原理,保證可見性原理。
Synchronized由什么樣的缺陷?Java Lock是怎么彌補這些缺陷的。
Synchronized和Lock的對比,和選擇?
Synchronized在使用時有何注意事項?
Synchronized修飾的方法在拋出異常時,會釋放鎖嗎?
多個線程等待同一個snchronized鎖的時候,JVM如何選擇下一個獲取鎖的線程?
Synchronized使得同時只有一個線程可以執(zhí)行,性能比較差,有什么提升的方法?
我想更加靈活地控制鎖的釋放和獲取(現(xiàn)在釋放鎖和獲取鎖的時機都被規(guī)定死了),怎么辦?
什么是鎖的升級和降級?什么是JVM里的偏斜鎖、輕量級鎖、重量級鎖?
不同的JDK中對Synchronized有何優(yōu)化?
關(guān)鍵字: volatile詳解
volatile關(guān)鍵字的作用是什么?
volatile能保證原子性嗎?
之前32位機器上共享的long和double變量的為什么要用volatile?現(xiàn)在64位機器上是否也要設(shè)置呢?
i++為什么不能保證原子性?
volatile是如何實現(xiàn)可見性的?內(nèi)存屏障。
volatile是如何實現(xiàn)有序性的?happens-before等
說下volatile的應(yīng)用場景?
關(guān)鍵字: final詳解
所有的final修飾的字段都是編譯期常量嗎?
如何理解private所修飾的方法是隱式的final?
說說final類型的類如何拓展?比如String是final類型,我們想寫個MyString復(fù)用所有String中方法,同時增加一個新的toMyString()的方法,應(yīng)該如何做?
final方法可以被重載嗎?可以
父類的final方法能不能夠被子類重寫?不可以
說說final域重排序規(guī)則?
說說final的原理?
使用 final 的限制條件和局限性?
看本文最后的一個思考題
J.U.C框架
Lock框架和Tools類
類結(jié)構(gòu)總覽

接口: Condition
Condition為接口類型,它將 Object 監(jiān)視器方法(wait、notify 和 notifyAll)分解成截然不同的對象,以便通過將這些對象與任意 Lock 實現(xiàn)組合使用,為每個對象提供多個等待 set (wait-set)。其中,Lock 替代了 synchronized 方法和語句的使用,Condition 替代了 Object 監(jiān)視器方法的使用??梢酝ㄟ^await(),signal()來休眠/喚醒線程。
在JUC鎖: AbstractQueuedSynchonizer詳解中類的內(nèi)部類-conditionobject類有具體分析。
接口: Lock
Lock為接口類型,Lock實現(xiàn)提供了比使用synchronized方法和語句可獲得的更廣泛的鎖定操作。此實現(xiàn)允許更靈活的結(jié)構(gòu),可以具有差別很大的屬性,可以支持多個相關(guān)的Condition對象。
接口: ReadWriteLock
ReadWriteLock為接口類型, 維護了一對相關(guān)的鎖,一個用于只讀操作,另一個用于寫入操作。只要沒有 writer,讀取鎖可以由多個 reader 線程同時保持。寫入鎖是獨占的。
抽象類: AbstractOwnableSynchonizer
AbstractOwnableSynchonizer為抽象類,可以由線程以獨占方式擁有的同步器。此類為創(chuàng)建鎖和相關(guān)同步器(伴隨著所有權(quán)的概念)提供了基礎(chǔ)。AbstractOwnableSynchronizer 類本身不管理或使用此信息。但是,子類和工具可以使用適當(dāng)維護的值幫助控制和監(jiān)視訪問以及提供診斷。
抽象類(long): AbstractQueuedLongSynchronizer
AbstractQueuedLongSynchronizer為抽象類,以 long 形式維護同步狀態(tài)的一個 AbstractQueuedSynchronizer 版本。此類具有的結(jié)構(gòu)、屬性和方法與 AbstractQueuedSynchronizer 完全相同,但所有與狀態(tài)相關(guān)的參數(shù)和結(jié)果都定義為 long 而不是 int。當(dāng)創(chuàng)建需要 64 位狀態(tài)的多級別鎖和屏障等同步器時,此類很有用。
核心抽象類(int): AbstractQueuedSynchonizer
AbstractQueuedSynchonizer為抽象類,其為實現(xiàn)依賴于先進先出 (FIFO) 等待隊列的阻塞鎖和相關(guān)同步器(信號量、事件,等等)提供一個框架。此類的設(shè)計目標(biāo)是成為依靠單個原子 int 值來表示狀態(tài)的大多數(shù)同步器的一個有用基礎(chǔ)。
詳細(xì)分析請看:?JUC鎖: AbstractQueuedSynchonizer詳解
鎖常用類: LockSupport
LockSupport為常用類,用來創(chuàng)建鎖和其他同步類的基本線程阻塞原語。LockSupport的功能和"Thread中的 Thread.suspend()和Thread.resume()有點類似",LockSupport中的park() 和 unpark() 的作用分別是阻塞線程和解除阻塞線程。但是park()和unpark()不會遇到“Thread.suspend 和 Thread.resume所可能引發(fā)的死鎖”問題。
詳細(xì)分析請看:?JUC鎖: LockSupport詳解
鎖常用類: ReentrantLock
ReentrantLock為常用類,它是一個可重入的互斥鎖 Lock,它具有與使用 synchronized 方法和語句所訪問的隱式監(jiān)視器鎖相同的一些基本行為和語義,但功能更強大。
詳細(xì)分析請看:?JUC鎖: ReentrantLock詳解
鎖常用類: ReentrantReadWriteLock
ReentrantReadWriteLock是讀寫鎖接口ReadWriteLock的實現(xiàn)類,它包括Lock子類ReadLock和WriteLock。ReadLock是共享鎖,WriteLock是獨占鎖。
詳細(xì)分析請看:?JUC工具類: ReentrantReadWriteLock詳解
鎖常用類: StampedLock
它是java8在java.util.concurrent.locks新增的一個API。StampedLock控制鎖有三種模式(寫,讀,樂觀讀),一個StampedLock狀態(tài)是由版本和模式兩個部分組成,鎖獲取方法返回一個數(shù)字作為票據(jù)stamp,它用相應(yīng)的鎖狀態(tài)表示并控制訪問,數(shù)字0表示沒有寫鎖被授權(quán)訪問。在讀鎖上分為悲觀鎖和樂觀鎖。
詳細(xì)分析請看:?Java 8 - StampedLock詳解
工具常用類: CountDownLatch
CountDownLatch為常用類,它是一個同步輔助類,在完成一組正在其他線程中執(zhí)行的操作之前,它允許一個或多個線程一直等待。
詳細(xì)分析請看:?JUC工具類: CountDownLatch詳解
工具常用類: CyclicBarrier
CyclicBarrier為常用類,其是一個同步輔助類,它允許一組線程互相等待,直到到達(dá)某個公共屏障點 (common barrier point)。在涉及一組固定大小的線程的程序中,這些線程必須不時地互相等待,此時 CyclicBarrier 很有用。因為該 barrier 在釋放等待線程后可以重用,所以稱它為循環(huán) 的 barrier。
詳細(xì)分析請看:?JUC工具類: CyclicBarrier詳解
工具常用類: Phaser
Phaser是JDK 7新增的一個同步輔助類,它可以實現(xiàn)CyclicBarrier和CountDownLatch類似的功能,而且它支持對任務(wù)的動態(tài)調(diào)整,并支持分層結(jié)構(gòu)來達(dá)到更高的吞吐量。
詳細(xì)分析請看:?JUC工具類: Phaser詳解
工具常用類: Semaphore
Semaphore為常用類,其是一個計數(shù)信號量,從概念上講,信號量維護了一個許可集。如有必要,在許可可用前會阻塞每一個 acquire(),然后再獲取該許可。每個 release() 添加一個許可,從而可能釋放一個正在阻塞的獲取者。但是,不使用實際的許可對象,Semaphore 只對可用許可的號碼進行計數(shù),并采取相應(yīng)的行動。通常用于限制可以訪問某些資源(物理或邏輯的)的線程數(shù)目。
詳細(xì)分析請看:?JUC工具類: Semaphore詳解
工具常用類: Exchanger
Exchanger是用于線程協(xié)作的工具類, 主要用于兩個線程之間的數(shù)據(jù)交換。它提供一個同步點,在這個同步點,兩個線程可以交換彼此的數(shù)據(jù)。這兩個線程通過exchange()方法交換數(shù)據(jù),當(dāng)一個線程先執(zhí)行exchange()方法后,它會一直等待第二個線程也執(zhí)行exchange()方法,當(dāng)這兩個線程到達(dá)同步點時,這兩個線程就可以交換數(shù)據(jù)了。
詳細(xì)分析請看:?JUC工具類: Exchanger詳解
Collections: 并發(fā)集合
類結(jié)構(gòu)關(guān)系

Queue: ArrayBlockingQueue
一個由數(shù)組支持的有界阻塞隊列。此隊列按 FIFO(先進先出)原則對元素進行排序。隊列的頭部 是在隊列中存在時間最長的元素。隊列的尾部 是在隊列中存在時間最短的元素。新元素插入到隊列的尾部,隊列獲取操作則是從隊列頭部開始獲得元素。
詳細(xì)分析請看:?JUC并發(fā)集合: BlockingQueue詳解
Queue: LinkedBlockingQueue
一個基于已鏈接節(jié)點的、范圍任意的 blocking queue。此隊列按 FIFO(先進先出)排序元素。隊列的頭部 是在隊列中時間最長的元素。隊列的尾部 是在隊列中時間最短的元素。新元素插入到隊列的尾部,并且隊列獲取操作會獲得位于隊列頭部的元素。鏈接隊列的吞吐量通常要高于基于數(shù)組的隊列,但是在大多數(shù)并發(fā)應(yīng)用程序中,其可預(yù)知的性能要低。
詳細(xì)分析請看:?JUC并發(fā)集合: BlockingQueue詳解
Queue: LinkedBlockingDeque
一個基于已鏈接節(jié)點的、任選范圍的阻塞雙端隊列。
詳細(xì)分析請看:?JUC并發(fā)集合: BlockingQueue詳解
Queue: ConcurrentLinkedQueue
一個基于鏈接節(jié)點的無界線程安全隊列。此隊列按照 FIFO(先進先出)原則對元素進行排序。隊列的頭部 是隊列中時間最長的元素。隊列的尾部 是隊列中時間最短的元素。新的元素插入到隊列的尾部,隊列獲取操作從隊列頭部獲得元素。當(dāng)多個線程共享訪問一個公共 collection 時,ConcurrentLinkedQueue 是一個恰當(dāng)?shù)倪x擇。此隊列不允許使用 null 元素。
詳細(xì)分析請看:?JUC并發(fā)集合: ConcurrentLinkedQueue詳解
Queue: ConcurrentLinkedDeque
是雙向鏈表實現(xiàn)的無界隊列,該隊列同時支持FIFO和FILO兩種操作方式。
Queue: DelayQueue
延時無界阻塞隊列,使用Lock機制實現(xiàn)并發(fā)訪問。隊列里只允許放可以“延期”的元素,隊列中的head是最先“到期”的元素。如果隊里中沒有元素到“到期”,那么就算隊列中有元素也不能獲取到。
Queue: PriorityBlockingQueue
無界優(yōu)先級阻塞隊列,使用Lock機制實現(xiàn)并發(fā)訪問。priorityQueue的線程安全版,不允許存放null值,依賴于comparable的排序,不允許存放不可比較的對象類型。
Queue: SynchronousQueue
沒有容量的同步隊列,通過CAS實現(xiàn)并發(fā)訪問,支持FIFO和FILO。
Queue: LinkedTransferQueue
JDK 7新增,單向鏈表實現(xiàn)的無界阻塞隊列,通過CAS實現(xiàn)并發(fā)訪問,隊列元素使用 FIFO(先進先出)方式。LinkedTransferQueue可以說是ConcurrentLinkedQueue、SynchronousQueue(公平模式)和LinkedBlockingQueue的超集, 它不僅僅綜合了這幾個類的功能,同時也提供了更高效的實現(xiàn)。
List: CopyOnWriteArrayList
ArrayList 的一個線程安全的變體,其中所有可變操作(add、set 等等)都是通過對底層數(shù)組進行一次新的復(fù)制來實現(xiàn)的。這一般需要很大的開銷,但是當(dāng)遍歷操作的數(shù)量大大超過可變操作的數(shù)量時,這種方法可能比其他替代方法更 有效。在不能或不想進行同步遍歷,但又需要從并發(fā)線程中排除沖突時,它也很有用。
詳細(xì)分析請看:?JUC并發(fā)集合: CopyOnWriteArrayList詳解
Set: CopyOnWriteArraySet
對其所有操作使用內(nèi)部CopyOnWriteArrayList的Set。即將所有操作轉(zhuǎn)發(fā)至CopyOnWriteArayList來進行操作,能夠保證線程安全。在add時,會調(diào)用addIfAbsent,由于每次add時都要進行數(shù)組遍歷,因此性能會略低于CopyOnWriteArrayList。
Set: ConcurrentSkipListSet
一個基于ConcurrentSkipListMap 的可縮放并發(fā) NavigableSet 實現(xiàn)。set 的元素可以根據(jù)它們的自然順序進行排序,也可以根據(jù)創(chuàng)建 set 時所提供的 Comparator 進行排序,具體取決于使用的構(gòu)造方法。
Map: ConcurrentHashMap
是線程安全HashMap的。ConcurrentHashMap在JDK 7之前是通過Lock和segment(分段鎖)實現(xiàn),JDK 8 之后改為CAS+synchronized來保證并發(fā)安全。
詳細(xì)分析請看: JUC并發(fā)集合: ConcurrentHashMap詳解, 包含了對JDK 7和JDK 8版本的源碼分析。
Map: ConcurrentSkipListMap
線程安全的有序的哈希表(相當(dāng)于線程安全的TreeMap);映射可以根據(jù)鍵的自然順序進行排序,也可以根據(jù)創(chuàng)建映射時所提供的 Comparator 進行排序,具體取決于使用的構(gòu)造方法。
Atomic: 原子類
其基本的特性就是在多線程環(huán)境下,當(dāng)有多個線程同時執(zhí)行這些類的實例包含的方法時,具有排他性,即當(dāng)某個線程進入方法,執(zhí)行其中的指令時,不會被其他線程打斷,而別的線程就像自旋鎖一樣,一直等到該方法執(zhí)行完成,才由JVM從等待隊列中選擇一個另一個線程進入,這只是一種邏輯上的理解。實際上是借助硬件的相關(guān)指令來實現(xiàn)的,不會阻塞線程(或者說只是在硬件級別上阻塞了)。
對CAS,Unsafe類,以及13個原子類詳解請參考:詳細(xì)分析請看: JUC原子類: CAS, Unsafe和原子類詳解
基礎(chǔ)類型:AtomicBoolean,AtomicInteger,AtomicLong
AtomicBoolean,AtomicInteger,AtomicLong是類似的,分別針對bool,interger,long的原子類。
數(shù)組:AtomicIntegerArray,AtomicLongArray,BooleanArray
AtomicIntegerArray,AtomicLongArray,AtomicBooleanArray是數(shù)組原子類。
引用:AtomicReference,AtomicMarkedReference,AtomicStampedReference
AtomicReference,AtomicMarkedReference,AtomicStampedReference是引用相關(guān)的原子類。
FieldUpdater:AtomicLongFieldUpdater,AtomicIntegerFieldUpdater,AtomicReferenceFieldUpdater
AtomicLongFieldUpdater,AtomicIntegerFieldUpdater,AtomicReferenceFieldUpdater是FieldUpdater原子類。
Executors: 線程池
類結(jié)構(gòu)關(guān)系

接口: Executor
Executor接口提供一種將任務(wù)提交與每個任務(wù)將如何運行的機制(包括線程使用的細(xì)節(jié)、調(diào)度等)分離開來的方法。通常使用 Executor 而不是顯式地創(chuàng)建線程。
ExecutorService
ExecutorService繼承自Executor接口,ExecutorService提供了管理終止的方法,以及可為跟蹤一個或多個異步任務(wù)執(zhí)行狀況而生成 Future 的方法??梢躁P(guān)閉 ExecutorService,這將導(dǎo)致其停止接受新任務(wù)。關(guān)閉后,執(zhí)行程序?qū)⒆詈蠼K止,這時沒有任務(wù)在執(zhí)行,也沒有任務(wù)在等待執(zhí)行,并且無法提交新任務(wù)。
ScheduledExecutorService
ScheduledExecutorService繼承自ExecutorService接口,可安排在給定的延遲后運行或定期執(zhí)行的命令。
AbstractExecutorService
AbstractExecutorService繼承自ExecutorService接口,其提供 ExecutorService 執(zhí)行方法的默認(rèn)實現(xiàn)。此類使用 newTaskFor 返回的 RunnableFuture 實現(xiàn) submit、invokeAny 和 invokeAll 方法,默認(rèn)情況下,RunnableFuture 是此包中提供的 FutureTask 類。
FutureTask
FutureTask 為 Future 提供了基礎(chǔ)實現(xiàn),如獲取任務(wù)執(zhí)行結(jié)果(get)和取消任務(wù)(cancel)等。如果任務(wù)尚未完成,獲取任務(wù)執(zhí)行結(jié)果時將會阻塞。一旦執(zhí)行結(jié)束,任務(wù)就不能被重啟或取消(除非使用runAndReset執(zhí)行計算)。FutureTask 常用來封裝 Callable 和 Runnable,也可以作為一個任務(wù)提交到線程池中執(zhí)行。除了作為一個獨立的類之外,此類也提供了一些功能性函數(shù)供我們創(chuàng)建自定義 task 類使用。FutureTask 的線程安全由CAS來保證。
詳細(xì)分析請看:?JUC線程池: FutureTask詳解
核心: ThreadPoolExecutor
ThreadPoolExecutor實現(xiàn)了AbstractExecutorService接口,也是一個 ExecutorService,它使用可能的幾個池線程之一執(zhí)行每個提交的任務(wù),通常使用 Executors 工廠方法配置。線程池可以解決兩個不同問題: 由于減少了每個任務(wù)調(diào)用的開銷,它們通常可以在執(zhí)行大量異步任務(wù)時提供增強的性能,并且還可以提供綁定和管理資源(包括執(zhí)行任務(wù)集時使用的線程)的方法。每個 ThreadPoolExecutor 還維護著一些基本的統(tǒng)計數(shù)據(jù),如完成的任務(wù)數(shù)。
詳細(xì)分析請看:?JUC線程池: ThreadPoolExecutor詳解
核心: ScheduledThreadExecutor
ScheduledThreadPoolExecutor實現(xiàn)ScheduledExecutorService接口,可安排在給定的延遲后運行命令,或者定期執(zhí)行命令。需要多個輔助線程時,或者要求 ThreadPoolExecutor 具有額外的靈活性或功能時,此類要優(yōu)于 Timer。
詳細(xì)分析請看:?JUC線程池: ScheduledThreadExecutor詳解
核心: Fork/Join框架
ForkJoinPool 是JDK 7加入的一個線程池類。Fork/Join 技術(shù)是分治算法(Divide-and-Conquer)的并行實現(xiàn),它是一項可以獲得良好的并行性能的簡單且高效的設(shè)計技術(shù)。目的是為了幫助我們更好地利用多處理器帶來的好處,使用所有可用的運算能力來提升應(yīng)用的性能。
詳細(xì)分析請看:?JUC線程池: Fork/Join框架詳解
工具類: Executors
Executors是一個工具類,用其可以創(chuàng)建ExecutorService、ScheduledExecutorService、ThreadFactory、Callable等對象。它的使用融入到了ThreadPoolExecutor, ScheduledThreadExecutor和ForkJoinPool中。
J.U.C框架重點面試題詳解
B. Java進階 - Java 并發(fā)之J.U.C框架:然后需要對J.U.C框架五大類詳細(xì)解讀,包括:Lock框架,并發(fā)集合, 原子類, 線程池和工具類。@pdai
JUC - 類匯總和學(xué)習(xí)指南
JUC框架包含幾個部分?
每個部分有哪些核心的類?
最最核心的類有哪些?
J.U.C框架【1/5】:CAS及原子類
B.1 Java進階 - Java 并發(fā)之J.U.C框架【1/5】:CAS及原子類:從最核心的CAS, Unsafe和原子類開始分析。
JUC原子類: CAS, Unsafe和原子類詳解
線程安全的實現(xiàn)方法有哪些?
什么是CAS?
CAS使用示例,結(jié)合AtomicInteger給出示例?
CAS會有哪些問題?
針對這這些問題,Java提供了哪幾個解決的?
AtomicInteger底層實現(xiàn)?CAS+volatile
請闡述你對Unsafe類的理解?
說說你對Java原子類的理解?包含13個,4組分類,說說作用和使用場景。
AtomicStampedReference是什么?
AtomicStampedReference是怎么解決ABA的?內(nèi)部使用Pair來存儲元素值及其版本號
java中還有哪些類可以解決ABA的問題?AtomicMarkableReference
J.U.C框架【2/5】:鎖
B.2 Java進階 - Java 并發(fā)之J.U.C框架【2/5】:鎖:然后分析JUC中鎖。
JUC鎖: LockSupport詳解
為什么LockSupport也是核心基礎(chǔ)類?AQS框架借助于兩個類:Unsafe(提供CAS操作)和LockSupport(提供park/unpark操作)
寫出分別通過wait/notify和LockSupport的park/unpark實現(xiàn)同步?
LockSupport.park()會釋放鎖資源嗎?那么Condition.await()呢?
Thread.sleep()、Object.wait()、Condition.await()、LockSupport.park()的區(qū)別?重點
如果在wait()之前執(zhí)行了notify()會怎樣?
如果在park()之前執(zhí)行了unpark()會怎樣?
JUC鎖: 鎖核心類AQS詳解
什么是AQS?為什么它是核心?
AQS的核心思想是什么?它是怎么實現(xiàn)的?底層數(shù)據(jù)結(jié)構(gòu)等
AQS有哪些核心的方法?
AQS定義什么樣的資源獲取方式?AQS定義了兩種資源獲取方式:
獨占(只有一個線程能訪問執(zhí)行,又根據(jù)是否按隊列的順序分為公平鎖和非公平鎖,如ReentrantLock) 和共享(多個線程可同時訪問執(zhí)行,如Semaphore、CountDownLatch、?CyclicBarrier?)。ReentrantReadWriteLock可以看成是組合式,允許多個線程同時對某一資源進行讀。AQS底層使用了什么樣的設(shè)計模式?模板
AQS的應(yīng)用示例?
JUC鎖: ReentrantLock詳解
什么是可重入,什么是可重入鎖?它用來解決什么問題?
ReentrantLock的核心是AQS,那么它怎么來實現(xiàn)的,繼承嗎?說說其類內(nèi)部結(jié)構(gòu)關(guān)系。
ReentrantLock是如何實現(xiàn)公平鎖的?
ReentrantLock是如何實現(xiàn)非公平鎖的?
ReentrantLock默認(rèn)實現(xiàn)的是公平還是非公平鎖?
使用ReentrantLock實現(xiàn)公平和非公平鎖的示例?
ReentrantLock和Synchronized的對比?
JUC鎖: ReentrantReadWriteLock詳解
為了有了ReentrantLock還需要ReentrantReadWriteLock?
ReentrantReadWriteLock底層實現(xiàn)原理?
ReentrantReadWriteLock底層讀寫狀態(tài)如何設(shè)計的?高16位為讀鎖,低16位為寫鎖
讀鎖和寫鎖的最大數(shù)量是多少?
本地線程計數(shù)器ThreadLocalHoldCounter是用來做什么的?
緩存計數(shù)器HoldCounter是用來做什么的?
寫鎖的獲取與釋放是怎么實現(xiàn)的?
讀鎖的獲取與釋放是怎么實現(xiàn)的?
RentrantReadWriteLock為什么不支持鎖升級?
什么是鎖的升降級?RentrantReadWriteLock為什么不支持鎖升級?
J.U.C框架【3/5】:集合
B.3 Java進階 - Java 并發(fā)之J.U.C框架【3/5】:集合:再理解JUC中重要的支持并發(fā)的集合。
JUC集合: ConcurrentHashMap詳解
為什么HashTable慢? 它的并發(fā)度是什么?那么ConcurrentHashMap并發(fā)度是什么?
ConcurrentHashMap在JDK1.7和JDK1.8中實現(xiàn)有什么差別?JDK1.8解決了JDK1.7中什么問題
ConcurrentHashMap JDK1.7實現(xiàn)的原理是什么?分段鎖機制
ConcurrentHashMap JDK1.8實現(xiàn)的原理是什么?數(shù)組+鏈表+紅黑樹,CAS
ConcurrentHashMap JDK1.7中Segment數(shù)(concurrencyLevel)默認(rèn)值是多少?為何一旦初始化就不可再擴容?
ConcurrentHashMap JDK1.7說說其put的機制?
ConcurrentHashMap JDK1.7是如何擴容的?rehash(注:segment 數(shù)組不能擴容,擴容是 segment 數(shù)組某個位置內(nèi)部的數(shù)組 HashEntry
[] 進行擴容) ConcurrentHashMap JDK1.8是如何擴容的?tryPresize
ConcurrentHashMap JDK1.8鏈表轉(zhuǎn)紅黑樹的時機是什么?臨界值為什么是8?
ConcurrentHashMap JDK1.8是如何進行數(shù)據(jù)遷移的?transfer
JUC集合: CopyOnWriteArrayList詳解
請先說說非并發(fā)集合中Fail-fast機制?
再為什么說ArrayList查詢快而增刪慢?
對比ArrayList說說CopyOnWriteArrayList的增刪改查實現(xiàn)原理? COW基于拷貝
再說下弱一致性的迭代器原理是怎么樣的?
COWIteratorCopyOnWriteArrayList為什么并發(fā)安全且性能比Vector好?
CopyOnWriteArrayList有何缺陷,說說其應(yīng)用場景?
JUC集合: ConcurrentLinkedQueue詳解
要想用線程安全的隊列有哪些選擇?Vector,
Collections.synchronizedList( List, ConcurrentLinkedQueue等list) ConcurrentLinkedQueue實現(xiàn)的數(shù)據(jù)結(jié)構(gòu)?
ConcurrentLinkedQueue底層原理?全程無鎖(CAS)
ConcurrentLinkedQueue的核心方法有哪些?offer(),poll(),peek(),isEmpty()等隊列常用方法
說說ConcurrentLinkedQueue的HOPS(延遲更新的策略)的設(shè)計?
ConcurrentLinkedQueue適合什么樣的使用場景?
JUC集合: BlockingQueue詳解
什么是BlockingDeque?
BlockingQueue大家族有哪些?ArrayBlockingQueue, DelayQueue, LinkedBlockingQueue, SynchronousQueue...
BlockingQueue適合用在什么樣的場景?
BlockingQueue常用的方法?
BlockingQueue插入方法有哪些?這些方法(
add(o),offer(o),put(o),offer(o, timeout, timeunit))的區(qū)別是什么?BlockingDeque 與BlockingQueue有何關(guān)系,請對比下它們的方法?
BlockingDeque適合用在什么樣的場景?
BlockingDeque大家族有哪些?
BlockingDeque 與BlockingQueue實現(xiàn)例子?
J.U.C框架【4/5】:線程池
B.4 Java進階 - Java 并發(fā)之J.U.C框架【4/5】:線程池:再者分析JUC中非常常用的線程池等。
JUC線程池: FutureTask詳解
FutureTask用來解決什么問題的?為什么會出現(xiàn)?
FutureTask類結(jié)構(gòu)關(guān)系怎么樣的?
FutureTask的線程安全是由什么保證的?
FutureTask結(jié)果返回機制?
FutureTask內(nèi)部運行狀態(tài)的轉(zhuǎn)變?
FutureTask通常會怎么用?舉例說明。
JUC線程池: ThreadPoolExecutor詳解
為什么要有線程池?
Java是實現(xiàn)和管理線程池有哪些方式?請簡單舉例如何使用。
為什么很多公司不允許使用Executors去創(chuàng)建線程池?那么推薦怎么使用呢?
ThreadPoolExecutor有哪些核心的配置參數(shù)?請簡要說明
ThreadPoolExecutor可以創(chuàng)建哪是哪三種線程池呢?
當(dāng)隊列滿了并且worker的數(shù)量達(dá)到maxSize的時候,會怎么樣?
說說ThreadPoolExecutor有哪些RejectedExecutionHandler策略?默認(rèn)是什么策略?
簡要說下線程池的任務(wù)執(zhí)行機制?execute –> addWorker –>runworker (getTask)
線程池中任務(wù)是如何提交的?
線程池中任務(wù)是如何關(guān)閉的?
在配置線程池的時候需要考慮哪些配置因素?
如何監(jiān)控線程池的狀態(tài)?
JUC線程池: ScheduledThreadPool詳解
ScheduledThreadPoolExecutor要解決什么樣的問題?
ScheduledThreadPoolExecutor相比ThreadPoolExecutor有哪些特性?
ScheduledThreadPoolExecutor有什么樣的數(shù)據(jù)結(jié)構(gòu),核心內(nèi)部類和抽象類?
ScheduledThreadPoolExecutor有哪兩個關(guān)閉策略?區(qū)別是什么?
ScheduledThreadPoolExecutor中scheduleAtFixedRate 和 scheduleWithFixedDelay區(qū)別是什么?
為什么ThreadPoolExecutor 的調(diào)整策略卻不適用于 ScheduledThreadPoolExecutor?
Executors 提供了幾種方法來構(gòu)造 ScheduledThreadPoolExecutor?
JUC線程池: Fork/Join框架詳解
Fork/Join主要用來解決什么樣的問題?
Fork/Join框架是在哪個JDK版本中引入的?
Fork/Join框架主要包含哪三個模塊?模塊之間的關(guān)系是怎么樣的?
ForkJoinPool類繼承關(guān)系?
ForkJoinTask抽象類繼承關(guān)系?在實際運用中,我們一般都會繼承 RecursiveTask 、RecursiveAction 或 CountedCompleter 來實現(xiàn)我們的業(yè)務(wù)需求,而不會直接繼承 ForkJoinTask 類。
整個Fork/Join 框架的執(zhí)行流程/運行機制是怎么樣的?
具體闡述Fork/Join的分治思想和work-stealing 實現(xiàn)方式?
有哪些JDK源碼中使用了Fork/Join思想?
如何使用Executors工具類創(chuàng)建ForkJoinPool?
寫一個例子: 用ForkJoin方式實現(xiàn)1+2+3+...+100000?
Fork/Join在使用時有哪些注意事項?結(jié)合JDK中的斐波那契數(shù)列實例具體說明。
J.U.C框架【5/5】:工具類
B.5 Java進階 - Java 并發(fā)之J.U.C框架【5/5】:工具類:最后來看下JUC中有哪些工具類,以及線程隔離術(shù)ThreadLocal。
JUC工具類: CountDownLatch詳解
什么是CountDownLatch?
CountDownLatch底層實現(xiàn)原理?
CountDownLatch一次可以喚醒幾個任務(wù)?多個
CountDownLatch有哪些主要方法?await(),countDown()
CountDownLatch適用于什么場景?
寫道題:實現(xiàn)一個容器,提供兩個方法,add,size 寫兩個線程,線程1添加10個元素到容器中,線程2實現(xiàn)監(jiān)控元素的個數(shù),當(dāng)個數(shù)到5個時,線程2給出提示并結(jié)束? 使用CountDownLatch 代替wait notify 好處。
JUC工具類: CyclicBarrier詳解
什么是CyclicBarrier?
CyclicBarrier底層實現(xiàn)原理?
CountDownLatch和CyclicBarrier對比?
CyclicBarrier的核心函數(shù)有哪些?
CyclicBarrier適用于什么場景?
JUC工具類: Semaphore詳解
什么是Semaphore?
Semaphore內(nèi)部原理?
Semaphore常用方法有哪些?如何實現(xiàn)線程同步和互斥的?
Semaphore適合用在什么場景?
單獨使用Semaphore是不會使用到AQS的條件隊列?
Semaphore中申請令牌(acquire)、釋放令牌(release)的實現(xiàn)?
Semaphore初始化有10個令牌,11個線程同時各調(diào)用1次acquire方法,會發(fā)生什么?
Semaphore初始化有10個令牌,一個線程重復(fù)調(diào)用11次acquire方法,會發(fā)生什么?
Semaphore初始化有1個令牌,1個線程調(diào)用一次acquire方法,然后調(diào)用兩次release方法,之后另外一個線程調(diào)用acquire(2)方法,此線程能夠獲取到足夠的令牌并繼續(xù)運行嗎?
Semaphore初始化有2個令牌,一個線程調(diào)用1次release方法,然后一次性獲取3個令牌,會獲取到嗎?
JUC工具類: Phaser詳解
Phaser主要用來解決什么問題?
Phaser與CyclicBarrier和CountDownLatch的區(qū)別是什么?
如果用CountDownLatch來實現(xiàn)Phaser的功能應(yīng)該怎么實現(xiàn)?
Phaser運行機制是什么樣的?
給一個Phaser使用的示例?
JUC工具類: Exchanger詳解
Exchanger主要解決什么問題?
對比SynchronousQueue,為什么說Exchanger可被視為 SynchronousQueue 的雙向形式?
Exchanger在不同的JDK版本中實現(xiàn)有什么差別?
Exchanger實現(xiàn)機制?
Exchanger已經(jīng)有了slot單節(jié)點,為什么會加入arena node數(shù)組?什么時候會用到數(shù)組?
arena可以確保不同的slot在arena中是不會相沖突的,那么是怎么保證的呢?
什么是偽共享,Exchanger中如何體現(xiàn)的?
Exchanger實現(xiàn)舉例
Java 并發(fā) - ThreadLocal詳解
什么是ThreadLocal?用來解決什么問題的?
說說你對ThreadLocal的理解
ThreadLocal是如何實現(xiàn)線程隔離的?
為什么ThreadLocal會造成內(nèi)存泄露?如何解決
還有哪些使用ThreadLocal的應(yīng)用場景?
PS:如果覺得我的分享不錯,歡迎大家隨手點贊、在看。
END
