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