Java并發(fā)編程深度解析與實戰(zhàn)
定 價:118 元
叢書名:咕泡教育Java架構師成長叢書
- 作者:譚鋒(Mic)
- 出版時間:2021/10/1
- ISBN:9787121421365
- 出 版 社:電子工業(yè)出版社
- 中圖法分類:TP312.8
- 頁碼:
- 紙張:膠版紙
- 版次:
- 開本:128開
本書涵蓋Java并發(fā)編程體系的核心庫和核心類使用及原理分析,具體包括線程、synchronized、volatile、J.U.C中的重入鎖和讀寫鎖、并發(fā)中的條件等待機制、J.U.C并發(fā)工具集、深度探索并發(fā)編程不得不知的工具、阻塞隊列、并發(fā)安全集合、線程池、異步編程特性等。書中針對每一個技術點,縱向分析相關的所有內容,并且對相關知識點進行了非常詳細的說明,同時站在架構實踐的角度來看待并發(fā),通過大量實戰(zhàn)案例讓讀者理解各類技術在實際應用中的使用方法。 作者花了4年時間投入了大量精力對并發(fā)編程領域做了深入的研究,將自己13年Java開發(fā)及架構經驗融入了書中,對于各位讀者來說,這應該是一本非常值得閱讀的圖書。
譚鋒,網(wǎng)名Mic。 咕泡學院聯(lián)合創(chuàng)始人,2017年開始創(chuàng)業(yè),至今已有4年多時間。擁有13年Java開發(fā)及架構經驗,其中有4年授課經驗,培養(yǎng)了3萬多名學員,學員遍布一二線主流互聯(lián)網(wǎng)企業(yè)。 曾就職于中國電信、平安支付、挖財?shù)裙緭螛I(yè)務架構師,在平安支付主導了基于Dubbo的服務化架構設計和落地,在挖財推動了基于Spring Boot微服務化架構的改造。因此對于微服務架構、高并發(fā)架構有非常深入的研究,以及豐富的實踐經驗。 目前擔任教學總監(jiān)一職,負責微服務及高并發(fā)領域的課程研發(fā)和設計。
目 錄
第1章 Java線程的實踐及原理揭秘1
1.1 如何理解系統(tǒng)并發(fā)1
1.2 系統(tǒng)如何支撐高并發(fā)2
1.3 線程的前世今生3
1.3.1 大白話理解進程和線程3
1.3.2 線程的核心價值5
1.3.3 如何理解并發(fā)和并行6
1.4 在Java中如何使用多線程6
1.4.1 實現(xiàn)Runnable接口創(chuàng)建線程6
1.4.2 繼承Thread類創(chuàng)建線程7
1.4.3 實現(xiàn)Callable接口并創(chuàng)建帶返回值的線程7
1.5 多線程如何應用到實際場景8
1.5.1 ServerSocket9
1.5.2 SocketThread10
1.6 多線程的基本原理11
1.7 線程的運行狀態(tài)11
1.7.1 線程運行狀態(tài)演示12
1.7.2 線程運行狀態(tài)流轉圖14
1.8 如何正確終止線程15
1.8.1 關于安全中斷線程的思考17
1.8.2 安全中斷線程之interrupt17
1.8.3 如何中斷處于阻塞狀態(tài)下的線程18
1.8.4 interrupt()方法的實現(xiàn)原理21
1.9 理解上下文切換帶來的性能影響24
1.9.1 上下文切換帶來的問題25
1.9.2 什么是上下文切換27
1.9.3 如何減少上下文切換29
1.10 揭秘守護線程30
1.10.1 守護線程的應用場景32
1.10.2 守護線程使用注意事項32
1.11 快速定位并解決線程導致的生產問題33
1.11.1 死鎖導致請求無法響應35
1.11.2 CPU占用率很高,響應很慢36
1.12 本章小結38
第2章 深度揭秘synchronized實現(xiàn)原理39
2.1 揭秘多線程環(huán)境下的原子性問題40
2.1.1 深入分析原子性問題的本質41
2.1.2 關于原子性問題的解決辦法43
2.2 Java中的synchronized同步鎖44
2.2.1 synchronized的使用方法44
2.2.2 了解synchronized同步鎖的作用范圍45
2.3 關于synchronized同步鎖的思考49
2.4 synchronzied同步鎖標記存儲分析49
2.4.1 揭秘Mark Word的存儲結構50
2.4.2 圖解分析對象的實際存儲52
2.4.3 通過ClassLayout查看對象內存布局53
2.4.4 Hotspot虛擬機中對象存儲的源碼57
2.5 synchronized的鎖類型59
2.5.1 偏向鎖的原理分析60
2.5.2 輕量級鎖的原理分析64
2.5.3 重量級鎖的原理分析65
2.6 關于CAS機制的實現(xiàn)原理分析68
2.6.1 CAS在AtomicInteger中的應用70
2.6.2 CAS實現(xiàn)自旋鎖72
2.6.3 CAS在JVM中的實現(xiàn)原理分析73
2.7 鎖升級的實現(xiàn)流程76
2.7.1 偏向鎖的實現(xiàn)原理77
2.7.2 輕量級鎖的實現(xiàn)原理82
2.7.3 重量級鎖的實現(xiàn)原理86
2.8 synchronized使用不當帶來的死鎖問題89
2.8.1 死鎖的案例分析90
2.8.2 死鎖產生的必要條件92
2.8.3 如何解決死鎖問題92
2.9 本章小結96
第3章 volatile為什么能解決可見性和有序性問題97
3.1 關于線程的可見性問題分析97
3.1.1 思考導致問題的原因98
3.1.2 volatile關鍵字解決可見性問題99
3.2 深度理解可見性問題的本質100
3.2.1 如何化提升CPU利用率100
3.2.2 詳述CPU高速緩存101
3.2.3 CPU緩存一致性問題107
3.2.4 總結可見性問題的本質111
3.3 volatile如何解決可見性問題112
3.4 指令重排序導致的可見性問題113
3.4.1 什么是指令重排序114
3.4.2 as-if-serial語義116
3.5 從CPU層面深度剖析指令重排序的本質117
3.5.1 CPU優(yōu)化Store Buffers117
3.5.2 CPU優(yōu)化Store Forwarding119
3.5.3 CPU優(yōu)化Invalidate Queues122
3.6 通過內存屏障解決內存系統(tǒng)重排序問題125
3.6.1 內存屏障詳解125
3.6.2 通過內存屏障防止重排序127
3.6.3 不同CPU的重排序規(guī)則128
3.6.4 總結CPU層面的可見性問題129
3.7 Java Memory Mode129
3.7.1 從JVM和硬件層面理解Java Memory Mode130
3.7.2 JVM提供的內存屏障指令133
3.8 揭秘volatile實現(xiàn)原理136
3.9 Happens-Before模型138
3.9.1 程序順序規(guī)則138
3.9.2 傳遞性規(guī)則139
3.9.3 volatile變量規(guī)則139
3.9.4 監(jiān)視器鎖規(guī)則140
3.9.5 start規(guī)則141
3.9.6 join規(guī)則141
3.10 本章小結142
第4章 深入淺出分析J.U.C中的重入鎖和讀寫鎖143
4.1 J.U.C中與鎖相關的API143
4.1.1 ReentrantLock的基本應用144
4.1.2 ReentrantReadWriteLock的基本應用145
4.1.3 StampedLock的基本應用147
4.2 ReentrantLock的設計猜想149
4.2.1 鎖的互斥,必須要競爭同一個共享變量150
4.2.2 沒有競爭到鎖的線程,需要阻塞151
4.2.3 需要一個容器存儲被阻塞的線程151
4.3 ReentrantLock實現(xiàn)原理分析151
4.4 AbstractQueuedSynchronizer152
4.5 ReentrantLock源碼分析154
4.5.1 ReentrantLock.lock()方法154
4.5.2 AbstractQueuedSynchronizer.acquire()方法156
4.5.3 NonfairSync.tryAcquire()方法156
4.5.4 ReentrantLock.nofairTryAcquire()方法157
4.5.5 AbstractQueuedSynchronizer.addWaiter()方法158
4.5.6 AQS.acquireQueued()方法159
4.6 ReentrantLock釋放鎖源碼分析162
4.6.1 ReentrantLock.tryRelease()方法163
4.6.2 unparkSuccessor()方法163
4.6.3 釋放鎖的線程繼續(xù)執(zhí)行164
4.7 分析ReentrantReadWriteLock類的原理166
4.7.1 WriteLock鎖競爭原理167
4.7.2 ReadLock鎖競爭原理170
4.7.3 ReentrantReadWriteLock中的鎖降級177
4.8 StampedLock的原理分析179
4.8.1 核心內部類分析180
4.8.2 StampedLock原理圖解182
4.8.3 StampedLock鎖升級184
4.9 本章小結187
第5章 從線程通信來窺探并發(fā)中的條件等待機制188
5.1 wait/notify189
5.1.1 wait()/notify()方法使用實戰(zhàn)189
5.1.2 圖解生產者/消費者192
5.1.3 wait()/notify()方法的原理193
5.1.4 wait()/notify()方法為什么要加同步鎖195
5.2 通過Thread.join獲取線程執(zhí)行結果195
5.2.1 Thread.join()方法的執(zhí)行流程196
5.2.2 Thread.join()方法的實現(xiàn)原理196
5.3 J.U.C中的條件控制Condition198
5.3.1 Condition的基本應用199
5.3.2 基于Condition的手寫阻塞隊列201
5.4 Condition的設計猜想203
5.5 Condition的源碼分析203
5.5.1 Condition.await()方法204
5.5.2 Condition.signal()方法208
5.5.3 鎖競爭成功后的執(zhí)行流程210
5.6 本章小結213
第6章 J.U.C并發(fā)工具集實戰(zhàn)及原理分析214
6.1 CountDownLatch簡單介紹214
6.1.1 CountDownLatch的基本使用215
6.1.2 CountDownLatch運行流程216
6.1.3 如何落地到實際應用216
6.1.4 CountDownLatch的其他用法220
6.2 CountDownLatch底層原理221
6.2.1 讓線程等待的await()方法到底做了什么222
6.2.2 深入分析countDown()方法源碼224
6.2.3 線程被喚醒后的執(zhí)行邏輯228
6.3 Semaphore230
6.3.1 Semaphore使用案例231
6.3.2 Semaphore方法及場景說明232
6.4 Semaphore原理分析233
6.4.1 Semaphore令牌獲取過程分析233
6.4.2 Semaphore令牌釋放過程分析236
6.5 CyclicBarrier237
6.5.1 CyclicBarrier的基本使用237
6.5.2 基本原理分析239
6.6 CyclicBarrier實現(xiàn)原理及源碼239
6.6.1 await()方法241
6.6.2 reset()方法244
6.7 本章小結244
第7章 深度探索并發(fā)編程不得不知的工具245
7.1 初步認識ThreadLocal245
7.2 ThreadLocal的應用場景分析247
7.3 ThreadLocal解決SimpleDateFormat線程安全問題249
7.3.1 SimpleDateFormat線程安全問題的原理250
7.3.2 ThreadLocal實現(xiàn)線程安全性253
7.4 ThreadLocal實現(xiàn)原理分析254
7.4.1 set()方法源碼分析255
7.4.2 get()方法源碼分析265
7.4.3 ThreadLocal內存泄漏266
7.5 任務拆分與聚合Fork/Join269
7.5.1 Fork/Join的核心API說明269
7.5.2 Fork/Join的基本使用270
7.6 Fork/Join的實現(xiàn)原理272
7.6.1 WorkQueue的原理274
7.6.2 工作竊取算法275
7.7 Fork/Join的核心源碼分析275
7.7.1 任務提交過程詳解276
7.7.2 喚醒或者創(chuàng)建工作線程281
7.7.3 工作線程和工作隊列的綁定283
7.7.4 ForkJoinWorkerThread運行過程285
7.8 使用Fork/Join解決實際問題286
7.8.1 項目結構說明286
7.8.2 ILoadDataProcessor287
7.8.3 AbstractLoadDataProcessor288
7.8.4 業(yè)務服務類288
7.8.5 Item聚合任務服務289
7.8.6 ComplexTradeTaskService291
7.8.7 測試代碼292
7.9 本章小結293
第8章 深度剖析阻塞隊列的設計原理及實現(xiàn)294
8.1 什么是阻塞隊列294
8.2 Java中提供的阻塞隊列295
8.3 阻塞隊列中提供的方法296
8.4 阻塞隊列的使用297
8.4.1 生產者/消費者模型代碼297
8.4.2 圖解阻塞隊列實現(xiàn)原理299
8.5 阻塞隊列應用實戰(zhàn)299
8.5.1 基于阻塞隊列的責任鏈源碼300
8.5.2 阻塞隊列實戰(zhàn)場景總結304
8.6 詳解J.U.C中阻塞隊列的使用305
8.6.1 基于數(shù)組結構的阻塞隊列ArrayBlockingQueue305
8.6.2 基于鏈表的阻塞隊列LinkedBlockingQueue306
8.6.3 優(yōu)先級阻塞隊列PriorityBlockingQueue308
8.6.4 延遲阻塞隊列DelayQueue310
8.6.5 無存儲結構的阻塞隊列SynchronousQueue314
8.6.6 阻塞隊