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