1. 開篇詞
你好,我是韋恩,在 Java 領(lǐng)域混跡 9 年有余。 相信每一位 Java 工程師對 Java 并發(fā)都不陌生,無論是面試、工作中編寫的代碼以及線上問題定位都需要并發(fā)知識。
-
Java 并發(fā)是面試中考察的基礎(chǔ)技能
Java 并發(fā)被認為是 Java 候選人必備的技能之一,面試中出現(xiàn)的頻率不亞于 JVM,很多工作多年的 Java 程序員因為平時不注重這方面的學習,與心儀的工作機會失之交臂。對 Java 并發(fā)考察一方面能反映候選人日常工作是否深入底層,平時遇到難題是否足夠多,另一方面還能反應(yīng)候選人是否有自我學習的驅(qū)動力,這也是篩選普通工程師和優(yōu)秀工程師的常用套路。
-
工作編碼中離不開并發(fā)知識
線程是 Java 語言不可或缺的功能,多線程能充分發(fā)揮多核心處理器系統(tǒng)的計算力,這使得我們寫 Java 代碼不得不理解多線程運行的原理,處理不當就會帶來線程安全問題(稍后章節(jié)會有講解)。我們接入的各種框架、中間件中充斥著并發(fā)代碼,掌握好并發(fā)知識能讓我們通過查看代碼做出最優(yōu)的技術(shù)選型。
-
問題診斷與定位離不開并發(fā)知識
在工作如果我們維護的尤其是擁有海量用戶的大型系統(tǒng),我們需要監(jiān)控系統(tǒng)中的每個細節(jié),要系統(tǒng)整體運行機制有了解,對系統(tǒng)有足夠的掌控力,并發(fā)知識是不可或缺的。比如線程池滿如何發(fā)生的?哪些線程消耗的 CPU 最高?造成死鎖的根源是什么?為什么多線程環(huán)境下結(jié)果與預(yù)期不一致?鎖等待造成的 RT 增高是否有優(yōu)化空間等等。
并發(fā)知識的 Java 工程師的必備技能,但學好并發(fā)卻不是件容易的事情,主要有三點。
-
Java 并發(fā)需要系統(tǒng)的進行學習
不同于 Java API, 可能我們看看樣例和代碼就掌握了,而學好并發(fā)我們需要首先熟悉并發(fā)理論,然后結(jié)合實踐掌握并發(fā)的解決方案,在學習過程中需要遵守循序漸進的原則。如果要達到舉一反三效果,還需要掌握并發(fā)包的內(nèi)部原理。
-
Java 并發(fā)是需要總結(jié)并形成記憶
并發(fā)領(lǐng)域包含的知識點非常多,有些知識點在工作中不常用但卻在面試中高頻出現(xiàn);有些知識點是為后續(xù)的知識點打基礎(chǔ)的;并發(fā)組件的使用是分場景的,我們需要對每一個并發(fā)組件的優(yōu)缺點了如指掌。
-
并發(fā)包的原理的研究需要花很長時間
核心原理是需要掌握的,比如 ThreadPoolExecutor 工作流程想必大家面試中都遇到過, 原理的研究最直接的方式就是 debug 源碼,但缺點就是非常費時費力,另外很難抓住核心。但如果通過圖形化來描述核心原理,那么對學習是事半功倍的。
2. 專欄特點
筆者自工作以來,一直對 Java 并發(fā)編程保持著濃厚的興趣,并將 Java 并發(fā)的學習所得總結(jié)成腦圖,并持續(xù)優(yōu)化,里面涵蓋了并發(fā)理論、代碼樣例、圖解原理、場景實踐,從全方位介紹各個并發(fā)組件,配上大量流程圖,并對其優(yōu)缺點進行多維對比;每一節(jié)文字會比較精煉,盡量將重心放到原理闡述和核心點講解上,保證干貨滿滿,相信該專欄能成為大家工作、面試中的掌中寶。
3. 課程模塊
專欄涵蓋的知識點比較全面,共分為八大模塊。
-
并發(fā)理論基礎(chǔ)
本模塊將從操作系統(tǒng)層面講解線程安全問題是如何產(chǎn)生的,在多線程編程的過程中,支撐我們解決線程安全問題的理論基礎(chǔ)是什么。本模塊是該專欄的基礎(chǔ),對后續(xù)模塊的學習有很大幫助,同時也會刷新大家對并發(fā)世界的重新認識。
-
Java 的線程狀態(tài)流轉(zhuǎn)
一個線程在它的生命周期內(nèi)從創(chuàng)建到銷毀都經(jīng)歷了哪幾種狀態(tài),狀態(tài)之間是如何流轉(zhuǎn)的,不同狀態(tài)下有什么表現(xiàn);線程如何終止和中斷;守護線程與普通線程有什么區(qū)別;線程間如何進行通信的,wait/signal 機制是什么;上述問題在本模塊都會得到解答。
-
Java 的 Atomic 類用在什么場景
Atomic 類在 Java 中是非常常用的類,本模塊會講解這些不同的 Atomic 類包括 AtomicInteger,AtomicBoolean,AtomicLong,AtomicReference,Atomic*FieldUpdater 分別用在什么場景,以及如何通過 CAS 操作實現(xiàn)無鎖化操作的,通過本模塊的學習,會進一步加深對 CAS 的認識。
-
Java 的鎖的運行原理是什么
講解 Lock 鎖與原生 Synchronized 鎖的區(qū)別,以及鎖的底層實現(xiàn) AQS,AQS 是整個并發(fā)包的核心,理解了 AQS 的原理就了解了鎖機制的實現(xiàn),結(jié)合常見的鎖沖入鎖和讀寫鎖,來講解這兩種鎖的使用場景和具體實現(xiàn)。
-
Java 中有哪些并發(fā)安全容器
講述線程安全的 List-CopyOnWriteArrayList,線程安全的 Set-CopyOnWriteSet,線程安全的 Map-ConcurrentHashMap,分為 jdk1.7 和 jdk1.8 兩個實現(xiàn)版本,并且闡述 HashMap 在多線程中如何出現(xiàn)死循環(huán)的。 本模塊還會對常見的隊列進行講解,包括阻塞隊列 ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、LinkedTransferBlockingQueue,以及非阻塞隊列 ConcurrentLinkedQueue,優(yōu)先隊列和延遲隊列 DelayQueue 及 DelayedWorkQueue。
-
面試熱點–Java 線程池
Java 線程池是面試??純?nèi)容,本模塊不僅會涵蓋線程池??嫉闹R點,還會講述整個線程池的底層實現(xiàn),jdk8 新特性 CompletableFuture,以及 Fork/Join 框架。
-
巧妙運用 Java 并發(fā)工具類解決并發(fā)問題
本模板會介紹常見的 Java 并發(fā)工具類,并且進行多維度對比,學完本模塊,大家能了解對各自工具類的活學活用。
-
多線程問題診斷與定位
本模塊會結(jié)合實際案例演示從問題的發(fā)現(xiàn)、止損、恢復(fù)的全過程,并且通過監(jiān)控工具實時查看線程運行狀態(tài),讓大家能夠?qū)€程運行狀態(tài)有一個全局的把握。
4. 學習建議
并發(fā)領(lǐng)域知識點之間關(guān)系是承上啟下的,學習一定要遵守一個循序漸進的過程,盡量不要跳章節(jié)學習。除此之外,專欄里面出現(xiàn)的代碼,一定要在 IDE 里面敲出來,并且親自運行,最好能自己改變下代碼,觀察不同場景下的運行結(jié)果,對知識的掌握會更加牢固。專欄中每個小節(jié)都會總結(jié)一個腦圖,在學習的過程中,最好結(jié)合自己的理解和學習最終畫出整個腦圖,以方便后續(xù)檢索和溫習;遇到理解不了了,及時和大家討論,經(jīng)過自己的思考實在想不出可以向筆者提問,筆者都是樂意為大家解答的。