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