## 01 開篇詞:多線程為什么是你必需要掌握的知識
> 當你做成功一件事,千萬不要等待著享受榮譽,應該再做那些需要的事。
> —— 巴斯德
你好,很榮幸你打開本專欄,看到我的這些文字。相信每一位開發者,都應該對多線程開發有所了解。作為程序員,如果不知道多線程,都不好意思和同行打招呼。但是對多線程有深入了解的開發人員卻并不多。有著豐富經驗的更是鳳毛麟角。多線程開發其實在軟件開發領域有著很重要的地位,絕大多數框架或者軟件工具都使用了多線程。比如耳熟能詳的 Tomcat、Kafka、Akka 等等。JVM 的垃圾回收也是由單獨的線程執行。正是有著如此多的優秀框架,才使得我們編寫絕大多數業務代碼時無需考慮使用多線程。
但這是否可以認為多線程開發對于普通開發者并不重要?其實恰恰相反。多線程開發在當今軟件領域變得越來越重要,是每個開發人員不但要了解,而且要徹底掌握的開發知識。多線程開發重要性從不同角度來看,有如下原因:
1. 提升代碼性能
現今是大數據的時代。隨著數據分析的需要、AI 學習的需要、存儲設備的廉價,越來越多的數據被采集下來,通過程序進行處理。面對海量的數據,如何榨取 CPU 的運算能力,提升運算效率,開發人員需要重點考慮。而 CPU 的發展從提升主頻轉為多核,使得多線程開發有了更大的用武之地。
另外在微服務大行其道的時代,恰當使用多線程,也能令你的程序性能大大提升。把沒有依賴的 API 調用以多線程的方式發送出去,并行處理拿到結果后再做進一步計算。執行比串行提高了幾倍,而且可以充分發揮出微服務分布式的計算優勢。
2. 更優秀的軟件設計和架構
相信做過 Java 開發的攻城獅都熟知面向對象。面向對象的出現,使得我們設計軟件更加貼近于真實世界,代碼封裝得更為合理。沒錯,其實軟件世界即現實世界。設計和開發無形的軟件,都是參考現實世界中有形的物體。現實世界可以認為是 "多線程" 的世界。每一個人是一個線程,每一臺運轉的機器是一個線程。掌握了多線程開發,能讓你設計出更加貼近真實世界的軟件,而不是憑空做出設計。其實優秀的軟件設計都是如此。比如 Java 中 NIO 的設計,和快遞投放極為相似。
3. 更好的工作機會
這個原因就比較現實了。目前絕大多數技術面試都會問到多線程的相關知識,尤其是互聯網大廠。通過面試多線程知識,除了可以看出你的技術深度,更重要可以看出你的學習能力。你可以沒用過多線程,但是如果在短時間內能夠把多線程深入掌握,說明候選人的學習能力、領悟能力都很高。
#### 專欄特色
關于多線程的學習其實還是有一定難度,一是多線程推翻了單線程開發的一些認知,二是理解多線程中的問題,需要學習部分 JVM 底層知識。這也是大多數開發人員對多線程僅停留在簡單了解層面的原因。本專欄目標是消除掉多線程學習上的攔路虎,讓每個人都能輕輕松松學習,并且最終能深入理解底層原理。為了達到這個目標,
專欄編寫會有如下特點:
1. 多以每個人都熟知的現實世界示例做類比,徹底消除掉理解上的鴻溝。
2. 配以生動有趣的插圖,讓知識的學習變得更為輕松。在枯燥的學習中也能開心一笑。相信有小慕陪伴的學習也會充滿了樂趣:

3. 由淺入深,從問題提出,到代碼示例。從解決方案到底層原理。徹底搞懂多線程開發的知識點。
4. 結合實踐進行講解。不只是停留在 “懂”,而是要再進一步到 “用”。技術學習的價值要體現在使用上。
#### 適合人群
多線程是 Java 的高級特性,所以本專欄并不適合沒有任何開發基礎的人員。不過只要你有一到兩年的開發經驗,閱讀本專欄不會有任何障礙。本專欄將會深入源代碼層面講解多線程相關知識,所以也適合有著豐富開發經驗,但想對多線程有更為深入了解的高級開發者。
本專欄適合的群體如下:
1、初入職場,有簡單的 Java 開發基礎,想要從基礎開始學習 Java 多線程開發。
2、有 3-5 年甚至更多開發經驗,想要深入了解 Java 多線程開發。
3、學習過多線程,想要了解在實際項目中如何應用。
4、準備跳槽面試,想要全方位,較為深入的學習多線程。
#### 專欄設置
為了達到由淺入深,從 “懂” 到 “用” 的目標。專欄設置如下四大模塊,每個模塊又由多個章節所組成。
1. Java 多線程開發基礎
本模塊為多線程開發入門。主要講解了多線程的基本概念以及在 Java 中如何進行基本的多線程開發。深入講解了 Thread 類的 API 以及多線程的啟動過程。
2. Java 并發問題及解決方法
多線程并發會遇到單線程程序中看似古怪的各種問題。多線程開發的難點也在于此。本模塊會深入分析這些問題產生的原因,并給出解決方法。在源代碼層面深入分析 atomic、volatile、synchronized 等多線程關鍵的同步技術。
3. Java 并發工具
本模塊會對 Java 提供的主要并發工具進行講解。包括線程池、Lock、CountDownLatch、CyclicBarrier 等。此外還有并發容器的深入分析,如 ConcurrentHashMap 等。這些都是實際開發中常用的并發技術,也是多線程面試的重點知識點。
4. 多線程程序設計模式
學習了以上這么多的多線程知識。最后我們來看看實際開發工作中如何設計多線程程序。通過合理的多線程程序設計,才能真正讓多線程體現出它的優勢。
本模塊涵蓋了 Future 模式、Master/Slave 模式等多線程程序設計的最佳實踐。通過本章學習,結合前面所學的基本知識,你已經可以大膽實踐多線程開發了!
#### 專欄學習建議
在專欄的學習上,從基礎概念開始,不要圖快直奔使用。概念的理解和學習自然枯燥,但卻是根基所在。只有深入理解理論知識,才能做到舉一反三,遇到問題從容應對。
建議在學習的過程中,做好學習筆記,把學到的知識以自己的語言記錄下來。這也是我學習的一個經驗,做記錄的過程也是一種輸出,會讓你的知識掌握更清晰、牢固。另外有問題一定要多交流,無論是和身邊的朋友,還是和我。學習就是不斷提問和解答的過程。沒有問題說明你沒有思考,沒有思考的學習效果也不會很好。
最后我很期待和你一起開啟 Java 多線程的學習。相信一起學習的每個人在專欄結束之時,都可以自信地說我徹底掌握了 Java 多線程開發!
- 前言
- 第1章 Java并發簡介
- 01 開篇詞:多線程為什么是你必需要掌握的知識
- 02 絕對不僅僅是為了面試—我們為什么需要學習多線程
- 03 多線程開發如此簡單—Java中如何編寫多線程程序
- 04 人多力量未必大—并發可能會遇到的問題
- 第2章 Java中如何編寫多線程
- 05 看若兄弟,實如父子—Thread和Runnable詳解
- 06 線程什么時候開始真正執行?—線程的狀態詳解
- 07 深入Thread類—線程API精講
- 08 集體協作,什么最重要?溝通!—線程的等待和通知
- 09 使用多線程實現分工、解耦、緩沖—生產者、消費者實戰
- 第3章 并發的問題和原因詳解
- 10 有福同享,有難同當—原子性
- 11 眼見不實—可見性
- 12 什么?還有這種操作!—有序性
- 13 問題的根源—Java內存模型簡介
- 14 僵持不下—死鎖詳解
- 第4章 如何解決并發問題
- 15 原子性輕量級實現—深入理解Atomic與CAS
- 16 讓你眼見為實—volatile詳解
- 17 資源有限,請排隊等候—Synchronized使用、原理及缺陷
- 18 線程作用域內共享變量—深入解析ThreadLocal
- 第5章 線程池
- 19 自己動手豐衣足食—簡單線程池實現
- 20 其實不用造輪子—Executor框架詳解
- 第6章 主要并發工具類
- 21 更高級的鎖—深入解析Lock
- 22 到底哪把鎖更適合你?—synchronized與ReentrantLock對比
- 23 按需上鎖—ReadWriteLock詳解
- 24 經典并發容器,多線程面試必備—深入解析ConcurrentHashMap上
- 25 經典并發容器,多線程面試必備—深入解析ConcurrentHashMap下
- 26不讓我進門,我就在門口一直等!—BlockingQueue和ArrayBlockingQueue
- 27 倒數計時開始,三、二、一—CountDownLatch詳解
- 28 人齊了,一起行動—CyclicBarrier詳解
- 29 一手交錢,一手交貨—Exchanger詳解
- 30 限量供應,不好意思您來晚了—Semaphore詳解
- 第7章 高級并發工具類及并發設計模式
- 31 憑票取餐—Future模式詳解
- 32 請按到場順序發言—Completion Service詳解
- 33 分階段執行你的任務-學習使用Phaser運行多階段任務
- 34 誰都不能偷懶-通過 CompletableFuture 組裝你的異步計算單元
- 35 拆分你的任務—學習使用Fork/Join框架
- 36 為多線程們安排一位經理—Master/Slave模式詳解
- 第8章 總結
- 37 結束語