<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 15686字,需瀏覽 32分鐘

           ·

          2021-03-18 23:14

          點擊上方 好好學(xué)java ,選擇 星標(biāo) 公眾號

          重磅資訊,干貨,第一時間送達(dá)

          今日推薦:14 個 github 項目!

          個人原創(chuàng)100W +訪問量博客:點擊前往,查看更多

          來源:cnblogs.com/pengdai/p/12026959.html



          知識體系系統(tǒng)性梳理

          Java 并發(fā)之基礎(chǔ)

          A. Java進(jìn)階 - 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ǔ)線程機(jī)制有哪些?

            • 線程的中斷方式有哪些?

            • 線程的互斥同步方式有哪些?如何比較和選擇?

            • 線程之間有哪些協(xié)作方式?

          并發(fā)關(guān)鍵字:volatile,final,synchronized

          • 關(guān)鍵字: synchronized詳解

            • Synchronized可以作用在哪里?分別通過對象鎖和類鎖進(jìn)行舉例。

            • Synchronized本質(zhì)上是通過什么保證線程安全的?分三個方面回答:加鎖和釋放鎖的原理,可重入原理,保證可見性原理。

            • Synchronized由什么樣的缺陷?Java Lock是怎么彌補(bǔ)這些缺陷的。

            • Synchronized和Lock的對比,和選擇?

            • Synchronized在使用時有何注意事項?

            • Synchronized修飾的方法在拋出異常時,會釋放鎖嗎?

            • 多個線程等待同一個snchronized鎖的時候,JVM如何選擇下一個獲取鎖的線程?

            • Synchronized使得同時只有一個線程可以執(zhí)行,性能比較差,有什么提升的方法?

            • 我想更加靈活地控制鎖的釋放和獲取(現(xiàn)在釋放鎖和獲取鎖的時機(jī)都被規(guī)定死了),怎么辦?

            • 什么是鎖的升級和降級?什么是JVM里的偏斜鎖、輕量級鎖、重量級鎖?

            • 不同的JDK中對Synchronized有何優(yōu)化?

          • 關(guān)鍵字: volatile詳解

            • volatile關(guān)鍵字的作用是什么?

            • volatile能保證原子性嗎?

            • 之前32位機(jī)器上共享的long和double變量的為什么要用volatile?現(xiàn)在64位機(jī)器上是否也要設(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為接口類型, 維護(hù)了一對相關(guān)的鎖,一個用于只讀操作,另一個用于寫入操作。只要沒有 writer,讀取鎖可以由多個 reader 線程同時保持。寫入鎖是獨占的。

          抽象類: AbstractOwnableSynchonizer

          AbstractOwnableSynchonizer為抽象類,可以由線程以獨占方式擁有的同步器。此類為創(chuàng)建鎖和相關(guān)同步器(伴隨著所有權(quán)的概念)提供了基礎(chǔ)。AbstractOwnableSynchronizer 類本身不管理或使用此信息。但是,子類和工具可以使用適當(dāng)維護(hù)的值幫助控制和監(jiān)視訪問以及提供診斷。

          抽象類(long): AbstractQueuedLongSynchronizer

          AbstractQueuedLongSynchronizer為抽象類,以 long 形式維護(hù)同步狀態(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)依賴于先進(jì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)視器鎖相同的一些基本行為和語義,但功能更強(qiáng)大。

          詳細(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ù)信號量,從概念上講,信號量維護(hù)了一個許可集。如有必要,在許可可用前會阻塞每一個 acquire(),然后再獲取該許可。每個 release() 添加一個許可,從而可能釋放一個正在阻塞的獲取者。但是,不使用實際的許可對象,Semaphore 只對可用許可的號碼進(jìn)行計數(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(先進(jìn)先出)原則對元素進(jìn)行排序。隊列的頭部 是在隊列中存在時間最長的元素。隊列的尾部 是在隊列中存在時間最短的元素。新元素插入到隊列的尾部,隊列獲取操作則是從隊列頭部開始獲得元素。

          詳細(xì)分析請看: JUC并發(fā)集合: BlockingQueue詳解

          Queue: LinkedBlockingQueue

          一個基于已鏈接節(jié)點的、范圍任意的 blocking queue。此隊列按 FIFO(先進(jìn)先出)排序元素。隊列的頭部 是在隊列中時間最長的元素。隊列的尾部 是在隊列中時間最短的元素。新元素插入到隊列的尾部,并且隊列獲取操作會獲得位于隊列頭部的元素。鏈接隊列的吞吐量通常要高于基于數(shù)組的隊列,但是在大多數(shù)并發(fā)應(yīng)用程序中,其可預(yù)知的性能要低。

          詳細(xì)分析請看: JUC并發(fā)集合: BlockingQueue詳解

          Queue: LinkedBlockingDeque

          一個基于已鏈接節(jié)點的、任選范圍的阻塞雙端隊列。

          詳細(xì)分析請看: JUC并發(fā)集合: BlockingQueue詳解

          Queue: ConcurrentLinkedQueue

          一個基于鏈接節(jié)點的無界線程安全隊列。此隊列按照 FIFO(先進(jìn)先出)原則對元素進(jìn)行排序。隊列的頭部 是隊列中時間最長的元素。隊列的尾部 是隊列中時間最短的元素。新的元素插入到隊列的尾部,隊列獲取操作從隊列頭部獲得元素。當(dāng)多個線程共享訪問一個公共 collection 時,ConcurrentLinkedQueue 是一個恰當(dāng)?shù)倪x擇。此隊列不允許使用 null 元素。

          詳細(xì)分析請看: JUC并發(fā)集合: ConcurrentLinkedQueue詳解

          Queue: ConcurrentLinkedDeque

          是雙向鏈表實現(xiàn)的無界隊列,該隊列同時支持FIFO和FILO兩種操作方式。

          Queue: DelayQueue

          延時無界阻塞隊列,使用Lock機(jī)制實現(xiàn)并發(fā)訪問。隊列里只允許放可以“延期”的元素,隊列中的head是最先“到期”的元素。如果隊里中沒有元素到“到期”,那么就算隊列中有元素也不能獲取到。

          Queue: PriorityBlockingQueue

          無界優(yōu)先級阻塞隊列,使用Lock機(jī)制實現(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(先進(jìn)先出)方式。LinkedTransferQueue可以說是ConcurrentLinkedQueue、SynchronousQueue(公平模式)和LinkedBlockingQueue的超集, 它不僅僅綜合了這幾個類的功能,同時也提供了更高效的實現(xiàn)。

          List: CopyOnWriteArrayList

          ArrayList 的一個線程安全的變體,其中所有可變操作(add、set 等等)都是通過對底層數(shù)組進(jìn)行一次新的復(fù)制來實現(xiàn)的。這一般需要很大的開銷,但是當(dāng)遍歷操作的數(shù)量大大超過可變操作的數(shù)量時,這種方法可能比其他替代方法更 有效。在不能或不想進(jìn)行同步遍歷,但又需要從并發(fā)線程中排除沖突時,它也很有用。

          詳細(xì)分析請看: JUC并發(fā)集合: CopyOnWriteArrayList詳解

          Set: CopyOnWriteArraySet

          對其所有操作使用內(nèi)部CopyOnWriteArrayList的Set。即將所有操作轉(zhuǎn)發(fā)至CopyOnWriteArayList來進(jìn)行操作,能夠保證線程安全。在add時,會調(diào)用addIfAbsent,由于每次add時都要進(jìn)行數(shù)組遍歷,因此性能會略低于CopyOnWriteArrayList。

          Set: ConcurrentSkipListSet

          一個基于ConcurrentSkipListMap 的可縮放并發(fā) NavigableSet 實現(xiàn)。set 的元素可以根據(jù)它們的自然順序進(jìn)行排序,也可以根據(jù)創(chuàng)建 set 時所提供的 Comparator 進(jìn)行排序,具體取決于使用的構(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ìn)行排序,也可以根據(jù)創(chuàng)建映射時所提供的 Comparator 進(jìn)行排序,具體取決于使用的構(gòu)造方法。


          Atomic: 原子類

          其基本的特性就是在多線程環(huán)境下,當(dāng)有多個線程同時執(zhí)行這些類的實例包含的方法時,具有排他性,即當(dāng)某個線程進(jìn)入方法,執(zhí)行其中的指令時,不會被其他線程打斷,而別的線程就像自旋鎖一樣,一直等到該方法執(zhí)行完成,才由JVM從等待隊列中選擇一個另一個線程進(jìn)入,這只是一種邏輯上的理解。實際上是借助硬件的相關(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ù)將如何運行的機(jī)制(包括線程使用的細(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ù)時提供增強(qiáng)的性能,并且還可以提供綁定和管理資源(包括執(zhí)行任務(wù)集時使用的線程)的方法。每個 ThreadPoolExecutor 還維護(hù)著一些基本的統(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進(jìn)階 - 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進(jìn)階 - 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進(jìn)階 - 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í)行,如SemaphoreCountDownLatch、 CyclicBarrier )。ReentrantReadWriteLock可以看成是組合式,允許多個線程同時對某一資源進(jìn)行讀。

            • 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進(jìn)階 - 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)的原理是什么?分段鎖機(jī)制

            • ConcurrentHashMap JDK1.8實現(xiàn)的原理是什么?數(shù)組+鏈表+紅黑樹,CAS

            • ConcurrentHashMap JDK1.7中Segment數(shù)(concurrencyLevel)默認(rèn)值是多少?為何一旦初始化就不可再擴(kuò)容?

            • ConcurrentHashMap JDK1.7說說其put的機(jī)制?

            • ConcurrentHashMap JDK1.7是如何擴(kuò)容的?rehash(注:segment 數(shù)組不能擴(kuò)容,擴(kuò)容是 segment 數(shù)組某個位置內(nèi)部的數(shù)組 HashEntry<K,V>[] 進(jìn)行擴(kuò)容)

            • ConcurrentHashMap JDK1.8是如何擴(kuò)容的?tryPresize

            • ConcurrentHashMap JDK1.8鏈表轉(zhuǎn)紅黑樹的時機(jī)是什么?臨界值為什么是8?

            • ConcurrentHashMap JDK1.8是如何進(jìn)行數(shù)據(jù)遷移的?transfer

          • JUC集合: CopyOnWriteArrayList詳解

            • 請先說說非并發(fā)集合中Fail-fast機(jī)制?

            • 再為什么說ArrayList查詢快而增刪慢?

            • 對比ArrayList說說CopyOnWriteArrayList的增刪改查實現(xiàn)原理? COW基于拷貝

            • 再說下弱一致性的迭代器原理是怎么樣的?COWIterator<E>

            • CopyOnWriteArrayList為什么并發(fā)安全且性能比Vector好?

            • CopyOnWriteArrayList有何缺陷,說說其應(yīng)用場景?

          • JUC集合: ConcurrentLinkedQueue詳解

            • 要想用線程安全的隊列有哪些選擇?Vector,Collections.synchronizedList( List<T> list), ConcurrentLinkedQueue等

            • 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進(jìn)階 - Java 并發(fā)之J.U.C框架【4/5】:線程池:再者分析JUC中非常常用的線程池等。

          • JUC線程池: FutureTask詳解

            • FutureTask用來解決什么問題的?為什么會出現(xiàn)?

            • FutureTask類結(jié)構(gòu)關(guān)系怎么樣的?

            • FutureTask的線程安全是由什么保證的?

            • FutureTask結(jié)果返回機(jī)制?

            • 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í)行機(jī)制?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í)行流程/運行機(jī)制是怎么樣的?

            • 具體闡述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進(jìn)階 - 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運行機(jī)制是什么樣的?

            • 給一個Phaser使用的示例?

          • JUC工具類: Exchanger詳解

            • Exchanger主要解決什么問題?

            • 對比SynchronousQueue,為什么說Exchanger可被視為 SynchronousQueue 的雙向形式?

            • Exchanger在不同的JDK版本中實現(xiàn)有什么差別?

            • Exchanger實現(xiàn)機(jī)制?

            • 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)用場景?

          推薦文章

          更多項目源碼


          瀏覽 69
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  操的爽| 亚洲一级一级黄色 | 欧美在线日韩在线 | 99热99re6国产在线播放 | 超碰碰免费 |