3dwoo大學簡體電腦書店
Java并發編程之美
( 簡體 字)
作者:翟陸續,薛賓田類別:1. -> 程式設計 -> JAVA -> Java
出版社:電子工業出版社Java并發編程之美 3dWoo書號: 50177
詢問書籍請說出此書號!
有庫存
NT售價: 445
出版日:10/1/2018
頁數:356
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 字 )
ISBN:9787121349478 加入購物車加到我的最愛 (請先登入會員)
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證, 繁體書的下載亦請直接連絡出版社)
第一部分 Java 并發編程基礎篇
第1 章 并發編程線程基礎 / 2
1.1 什么是線程 / 2
1.2 線程創建與運行 / 3
1.3 線程通知與等待 / 6
1.4 等待線程執行終止的join 方法 / 16
1.5 讓線程睡眠的sleep 方法 / 19
1.6 讓出CPU 執行權的yield 方法 / 24
1.8 理解線程上下文切換 / 30
1.9 線程死鎖 / 30
1.9.1 什么是線程死鎖 / 30
1.9.2 如何避免線程死鎖 / 33
1.10 守護線程與用戶線程 / 35
1.11 ThreadLocal / 39
1.11.1 ThreadLocal 使用示例 / 40
1.11.2 ThreadLocal 的實現原理 / 42
1.11.3 ThreadLocal 不支持繼承性 / 45
1.11.4 InheritableThreadLocal 類 / 46
第2 章 并發編程的其他基礎知識 / 50
2.1 什么是多線程并發編程 / 50
2.2 為什么要進行多線程并發編程 / 51
2.3 Java 中的線程安全問題 / 51
2.4 Java 中共享變量的內存可見性問題 / 52
2.5 Java 中的synchronized 關鍵字 / 54
2.5.1 synchronized 關鍵字介紹 / 54
2.5.2 synchronized 的內存語義 / 55
2.6 Java 中的volatile 關鍵字 / 55
2.7 Java 中的原子性操作 / 57
2.8 Java 中的CAS 操作 / 59
2.9 Unsafe 類 / 59
2.9.1 Unsafe 類中的重要方法 / 59
2.9.2 如何使用Unsafe 類 / 61
2.10 Java 指令重排序 / 65
2.11 偽共享 / 67
2.11.1 什么是偽共享 / 67
2.11.2 為何會出現偽共享 / 68
2.11.3 如何避免偽共享 / 70
2.11.4 小結 / 72
2.12 鎖的概述 / 72
2.12.1 樂觀鎖與悲觀鎖 / 72
2.12.2 公平鎖與非公平鎖 / 75
2.12.3 獨占鎖與共享鎖 / 75
2.12.4 什么是可重入鎖 / 76
2.12.5 自旋鎖 / 77
2.13 總結 / 77
第二部分 Java 并發編程高級篇
第3 章 Java 并發包中ThreadLocalRandom 類原理剖析 / 80
3.1 Random 類及其局限性 / 80
3.2 ThreadLocalRandom / 82
3.3 源碼分析 / 84
3.4 總結 / 87
第4 章 Java 并發包中原子操作類原理剖析
4.1 原子變量操作類 / 88
4.2 JDK 8 新增的原子操作類LongAdder / 93
4.2.1 LongAdder 簡單介紹 / 93
4.2.2 LongAdder 代碼分析 / 95
4.2.3 小結 / 101
4.3 LongAccumulator 類原理探究 / 102
4.4 總結 / 104
第5 章 Java 并發包中并發List 源碼剖析 / 105
5.1 介紹 / 105
5.2 主要方法源碼解析 / 106
5.2.1 初始化 / 106
5.2.2 添加元素 / 106
5.2.3 獲取指定位置元素 / 108
5.2.4 修改指定元素 / 109
5.2.5 刪除元素 / 110
5.2.6 弱一致性的迭代器 / 111
5.3 總結 / 114
第6 章 Java 并發包中鎖原理剖析 / 115
6.1 LockSupport 工具類 / 115
6.2 抽象同步隊列AQS 概述 / 122
6.2.1 AQS——鎖的底層支持 / 122
6.2.2 AQS——條件變量的支持 / 128
6.2.3 基于AQS 實現自定義同步器 / 131
6.3 獨占鎖ReentrantLock 的原理 / 136
6.3.1 類圖結構 / 136
6.3.2 獲取鎖 / 137
6.3.3 釋放鎖 / 142
6.3.4 案例介紹 / 143
6.3.5 小結 / 145
6.4 讀寫鎖ReentrantReadWriteLock 的原理 / 145
6.4.1 類圖結構 / 145
6.4.2 寫鎖的獲取與釋放 / 147
6.4.3 讀鎖的獲取與釋放 / 151
6.4.5 小結 / 158
6.5 JDK 8 中新增的StampedLock 鎖探究 / 158
6.5.1 概述 / 158
6.5.2 案例介紹 / 160
6.5.3 小結 / 164
第7 章 Java 并發包中并發隊列原理剖析 / 165
7.1 ConcurrentLinkedQueue 原理探究 / 165
7.1.1 類圖結構 / 165
7.1.2 ConcurrentLinkedQueue 原理介紹 / 166
7.1.3 小結 / 181
7.2 LinkedBlockingQueue 原理探究 / 182
7.2.1 類圖結構 / 182
7.2.2 LinkedBlockingQueue 原理介紹 / 185
7.2.3 小結 / 194
7.3 ArrayBlockingQueue 原理探究 / 195
7.3.1 類圖結構 / 195
7.3.2 ArrayBlockingQueue 原理介紹 / 197
7.3.3 小結 / 202
7.4 PriorityBlockingQueue 原理探究 / 203
7.4.1 介紹 / 203
7.4.2 PriorityBlockingQueue 類圖結構 / 203
7.4.3 原理介紹 / 205
7.4.4 案例介紹 / 214
7.4.5 小結 / 216
7.5 DelayQueue 原理探究 / 217
7.5.1 DelayQueue 類圖結構 / 217
7.5.2 主要函數原理講解 / 219
7.5.3 案例介紹 / 222
7.5.4 小結 / 224
第8 章 Java 并發包中線程池ThreadPoolExecutor 原理探究 / 225
8.1 介紹 / 225
8.2 類圖介紹 / 225
8.3 源碼分析 / 230
8.3.1 public void execute(Runnable command) / 230
8.3.2 工作線程Worker 的執行 / 235
8.3.3 shutdown 操作 / 238
8.3.4 shutdownNow 操作 / 240
8.3.5 awaitTermination 操作 / 241
8.4 總結 / 242
第9 章 Java 并發包中ScheduledThreadPoolExecutor 原理探究 / 243
9.1 介紹 / 243
9.2 類圖介紹 / 243
9.3 原理剖析 / 245
9.3.1 schedule(Runnable command, long delay,TimeUnit unit) 方法 / .246
9.3.2 scheduleWithFixedDelay(Runnable command,long initialDelay, long delay,
TimeUnit unit) 方法 / 252
9.3.3 scheduleAtFixedRate(Runnable command,long initialDelay,long period,
TimeUnit unit) 方法 / 254
9.4 總結 / 255
第10 章 Java 并發包中線程同步器原理剖析 / 256
10.1  CountDownLatch 原理剖析 / 256
10.1.1 案例介紹 / 256
10.1.2實現原理探究/259
10.1.3小結/263
10.2回環屏障CyclicBarrier原理探究/264
10.2.1案例介紹/264
10.2.2實現原理探究/268
10.2.3小結/272
11.1ArrayBlockingQueue的使用/284
11.1.1異步日志打印模型概述/284
11.1.2異步日志與具體實現/285
11.1.3小結/293
11.2Tomcat的NioEndPoint中ConcurrentLinkedQueue的使用/293
11.2.1生產者——Acceptor線程/294
11.2.2消費者——Poller線程/298
11.2.3小結/300
11.3并發組件ConcurrentHashMap使用注意事項/300
11.4SimpleDateFormat是線程不安全的/304
11.4.1問題復現/304
11.4.2問題分析/305
11.4.3小結/309
11.5使用Timer時需要注意的事情/309
11.5.1問題的產生/309
11.5.2Timer實現原理分析/310
11.5.3小結/313
11.6對需要復用但是會被下游修改的參數要進行深復制/314
11.6.1問題的產生/314
11.6.2問題分析/316
11.6.3小結/318
11.7創建線程和線程池時要指定與業務相關的名稱/319
11.7.1創建線程需要有線程名/319
11.7.2創建線程池時也需要指定線程池的名稱/321
11.7.3小結/325
11.8使用線程池的情況下當程序結束時記得調用shutdown關閉線程池/325
11.8.1問題復現/325
11.8.2問題分析/327
11.8.3小結/329
11.9線程池使用FutureTask時需要注意的事情/329
11.9.1問題復現/329
11.9.2問題分析/332
11.9.3小結335
11.10使用ThreadLocal不當可能會導致內存泄漏/336
11.10.1為何會出現內存泄漏/336
11.10.2在線程池中使用ThreadLocal導致的內存泄漏/339
11.10.3在Tomcat的Servlet中使用ThreadLocal導致內存泄漏/341
11.10.4小結/344
11.11總結/344
并發編程相比 Java 中其他知識點的學習門檻較高,從而導致很多人望而卻步。但無論是職場面試,還是高并發/ 高流量系統的實現,卻都離不開并發編程,于是能夠真正掌握并發編程的人成為了市場迫切需求的人才。本書通過圖文結合、通俗易懂的講解方式幫助大家完成多線程并發編程從入門到實踐的飛躍!全書分為三部分,第一部分為Java 并發編程基礎篇,主要講解Java 并發編程的基礎知識、線程有關的知識和并發編程中的其他相關概念,這些知識在高級篇都會有所使用,掌握了本篇的內容,就為學習高級篇奠定了基礎;第二部分為Java 并發編程高級篇,講解了Java 并發包中核心組件的實現原理,讓讀者知其然,也知其所以然,熟練掌握本篇內容,對我們在日常開發高并發、高流量的系統時會大有裨益;第三部分為Java 并發編程實踐篇,主要講解并發組件的使用方法,以及在使用過程中容易遇到的問題和解決方法。


本書特色
不像其他并發類書籍那樣晦澀難懂,本書的特色之一是通俗易懂,對Java 有一定基礎的開發人員都可以看懂。本書在基礎篇專門講解并發編程基礎,筆者根據在項目實踐中對這些知識的理解,總結了并發編程中常用的基礎知識以及常用的概念,并通過圖文結合的方式降低理解的難度,使用少量的代碼講解就可以讓讀者輕松掌握并發編程的基礎知識,讓讀者逐步建立起自信。在高級篇主要講解JUC 并發包下并發組件的實現原理,首先介紹JUC 里面最簡單的原子類,讓讀者學會使用在基礎篇里介紹的最簡單的CAS 操作,再逐步加大難度讓讀者慢慢適應:比如一開始打算把并發List 放到鎖后面講解,因為并發List 里面使用了鎖,但是鎖的理解難度比List 大太多,所以最終還是堅持從易入難的原則,先講解List,再講解鎖。在實踐篇中首先講解并發組件在開源框架或者項目中的運用,讓讀者不僅可以知道并發組件的原理,而且可以了解怎么使用這些組件。最后總結筆者在項目中或者其他同事在項目中經常遇到的并發編程問題,并對其進行分析,給出解決方案。
如果你只想使用并發包,那么可以閱讀本書,因為本書在講解代碼時基本都是用的實例;如果你想研究源碼卻一籌莫展——不知道如何下手或者感覺吃力,也可以閱讀本書,因為本書對核心代碼進行了講解;如果你想了解并發編程中的常見問題,增加對并發的認識,也可以閱讀本書,因為本書對這類問題進行了總結。

如何閱讀本書
本書分為基礎篇、高級篇和實踐篇,其中基礎篇講解線程的知識和并發編程中的基本概念以及基礎知識,高級篇則介紹并發包下常用的并發組件的原理,實踐篇講解并發組件的具體使用方法和在并發編程中會遇到的一些并發問題及解決方法。
閱讀開源框架源碼的一點心得
為什么要看源碼
我們在做項目的時候一般會遇到下面的問題:
(1)不知道如何去設計。比如剛入職場時,來一個需求需做概要設計,不知如何下手,不得不去看當前系統類似需求是如何設計的,然后仿照去設計。
(2)設計的時候,考慮問題不周全。相比職場新手,這類人對一個需求依靠自己的經驗已經能夠拿出一個概要設計,但是設計中經常會遺漏一些異常細節,比如使用多線程有界隊列執行任務,遇到機器宕機了,如果隊列里面的任務不存盤的話,那么機器下次啟動的時候這些任務就丟失了。
對于這些問題,說到底主要還是因為經驗不夠,而經驗主要從項目實踐中積累,所以招聘單位一般都會限定工作時間大于 3 年,因為這些人的項目經驗相對較豐富,在項目中遇到的場景相對較多。工作經驗的積累來自于年限與實踐,然而看源碼可以擴展我們的思路,這是變相增加我們經驗的不錯方法。雖然不能在短時間內通過時間積累經驗,但是可以通過學習開源框架、開源項目來獲取經驗。
另外,進職場后一般都要先熟悉現有系統,如果有文檔還好,沒文檔的話就得自己去翻代碼研究。如果之前對閱讀源碼有經驗,那么在研究新系統的代碼邏輯時就不會那么費勁了。
還有一點就是,當你使用框架或者工具做開發時,如果你對它的實現有所了解,就能最大化地減少出故障的可能。比如并發隊列 ArrayBlockingQueue 里面關于元素入隊有個offer 方法 和 put 方法,雖然某個時間點你知道使用 offer 方法時,當隊列滿了就會丟棄要入隊的元素,之后 offer 方法會返回 false,而不會阻塞當前線程;而使用 put 方法時,當隊列滿了,則會掛起當前線程,直到隊列有空閑,元素入隊成功后才返回。但是人是善忘的,一段時間不使用,就會忘記它們的區別,當你再去使用時,需進入 offer 和 put 方法的內部,看它們的源碼實現。進入 offer 方法一看,哦,原來隊列滿后直接返回了 false ;進入 put方法一看,哦,原來隊列滿后,直接使用條件變量的 await 方法掛起了當前線程。知道了它們的區別,你就可以根據自己的需求來選擇了。看源碼最大的好處是可以開闊思維,提升架構設計能力。有些東西僅靠書本和自己思考是很難學到的,必須通過看源碼,看別人如何設計,然后思考為何這樣設計才能領悟到。
能力的提高不在于你寫了多少代碼,做了多少項目,而在于給你一個業務場景時,你是否能拿出幾種靠譜的解決方案,并且說出各自的優缺點。而如何才能拿出來,一來靠經驗,二來靠歸納總結,而看源碼可以快速增加你的經驗。

如何看源碼
那么如何閱讀源碼呢?在你看某一個框架的源碼前,先去 Google 查找這個開源框架的官方介紹,通過資料了解該框架有幾個模塊,各個模塊是做什么的,之間有什么聯系,每個模塊都有哪些核心類,在閱讀源碼時可以著重看這些類。
然后對哪個模塊感興趣就去寫個小 demo,先了解一下這個模塊的具體作用,然后再debug 進入看具體實現。在 debug 的過程中,第一遍是走馬觀花,簡略看一下調用邏輯,都用了哪些類;第二遍需有重點地 debug,看看這些類擔任了架構圖里的哪些功能,使用了哪些設計模式。如果第二遍有感覺了,便大致知道了整體代碼的功能實現,但是對整體代碼結構還不是很清晰,畢竟代碼里面多個類來回調用,很容易遺忘當前斷點的來處;那么你可以進行第三遍 debug,這時候你最好把主要類的調用時序圖以及類圖結構畫出來,等畫好后,再對著時序圖分析調用流程,就可以清楚地知道類之間的調用關系,而通過類圖可以知道類的功能以及它們相互之間的依賴關系。
另外,開源框架里面每個功能類或者方法一般都有注釋,這些注釋是一手資料,比如JUC 包里的一些并發組件的注釋,就已經說明了它們的設計原理和使用場景。在閱讀源碼時,最好畫出時序圖和類圖,因為人總是善忘的。如果隔一段時間你再去看之前看過的源碼,雖然有些印象,但當你想去看某個模塊的邏輯時,又需根據 demo 再從頭 debug 了。而如果有了這倆圖,就可以從這倆圖里面直接找,并且看一眼時序圖就知道整個模塊的脈絡了。
此外,查框架使用說明最好去官網查(這些信息是源頭,是沒有經過別人翻譯的),雖然是英文,但是看久了就好了,畢竟還有 Google 翻譯吶!當然研究代碼時不一定非要 debug 三遍,其實這里說的是三種掌握程度,如果你
debug 一遍就能掌握,那自然更好啦。
pagetop