現(xiàn)代軟件規(guī)模大、實(shí)時(shí)性要求高,所以掌握提升處理和響應(yīng)速度的多線(xiàn)程技術(shù)勢(shì)在必行。本書(shū)涵蓋多線(xiàn)程編程的核心庫(kù)、方法、原理,透徹講解了高并發(fā)的本質(zhì)與應(yīng)對(duì)方法,幫助讀者解決高并發(fā)環(huán)境下的業(yè)務(wù)瓶頸。
●本書(shū)具體內(nèi)容如下。
第1章講解Java多線(xiàn)程的基礎(chǔ)知識(shí),包括Thread類(lèi)的核心API的使用。
第2章講解在多線(xiàn)程中通過(guò)synchronized關(guān)鍵字對(duì)并發(fā)訪(fǎng)問(wèn)進(jìn)行控制的方法,為讀者學(xué)習(xí)同步知識(shí)打好堅(jiān)實(shí)的基礎(chǔ)。
第3章介紹線(xiàn)程間通信,以在多線(xiàn)程中進(jìn)行數(shù)據(jù)傳遞。
第4章介紹并發(fā)訪(fǎng)問(wèn)時(shí)的同步處理實(shí)現(xiàn),包括讀寫(xiě)鎖(Lock對(duì)象)等相關(guān)技術(shù)點(diǎn)。
第5章剖析定時(shí)器Timer類(lèi)的內(nèi)部原理。定時(shí)器在A(yíng)ndroid開(kāi)發(fā)中會(huì)有深入應(yīng)用,是很重要的技術(shù)點(diǎn)。
第6章介紹單例模式下多線(xiàn)程的全面解決方案。
第7章對(duì)前面遺漏的知識(shí)點(diǎn)進(jìn)行補(bǔ)充,使多線(xiàn)程的知識(shí)體系更加完整,盡量做到不出現(xiàn)技術(shù)空白點(diǎn)。
第8章介紹并發(fā)集合框架,可以大大提升開(kāi)發(fā)多線(xiàn)程應(yīng)用程序的效率。
第9章介紹線(xiàn)程池的使用,讓線(xiàn)程管理更規(guī)范、高效。這也是Java程序員面試必問(wèn)的技術(shù)點(diǎn)。
1. 暢銷(xiāo)書(shū)作者撰寫(xiě),全新升級(jí),新增適用微服務(wù)與分布式開(kāi)發(fā)的并發(fā)工具與Java線(xiàn)程池
2. 全面剖析多線(xiàn)程編程的核心庫(kù)、方法、原理,案例式教學(xué),透徹了解高并發(fā)本質(zhì)與應(yīng)對(duì)方法
●為什么寫(xiě)作本書(shū)
不管是學(xué)習(xí)JavaSE、JavaEE、JavaWeb,還是學(xué)習(xí)Java大數(shù)據(jù)、Java移動(dòng)開(kāi)發(fā)、Java分布式、Java微服務(wù),多線(xiàn)程編程都是必不可少的核心技術(shù)點(diǎn)。本書(shū)是首本多線(xiàn)程技術(shù)書(shū),自第1版和第2版出版以來(lái),獲得了廣大Java程序員與學(xué)習(xí)者的關(guān)注,在技術(shù)論壇、博客、公眾號(hào)等平臺(tái)涌現(xiàn)了大量針對(duì)Java多線(xiàn)程技術(shù)的討論與分享。有些讀者在時(shí)間根據(jù)書(shū)中的知識(shí)總結(jié)了學(xué)習(xí)筆記,并在博客上進(jìn)行分享,這種傳播知識(shí)的精神令人贊賞和尊重,知識(shí)就要分享與傳播。我也很高興能為國(guó)內(nèi)IT知識(shí)的體系建設(shè)盡微薄之力。
然而本書(shū)第1版和第2版出版時(shí),基于Java的分布式/微服務(wù)技術(shù)還沒(méi)有強(qiáng)調(diào)性能的想法,只是單純地實(shí)現(xiàn)RPC遠(yuǎn)程調(diào)用即可,但隨著分布式/微服務(wù)技術(shù)的穩(wěn)定與推廣,我們發(fā)現(xiàn),單機(jī)的性能其實(shí)仍是分布式/微服務(wù)需要關(guān)注的基本點(diǎn),因?yàn)橹挥袉螜C(jī)運(yùn)行環(huán)境的性能上去了,分布式/微服務(wù)的整體性能才能得到大幅度的提高,而在這中間一定會(huì)涉及兩個(gè)技術(shù)點(diǎn):數(shù)據(jù)的組織和線(xiàn)程的管理。掌握了這兩個(gè)技術(shù)點(diǎn),讀者就可以自己實(shí)現(xiàn)消息隊(duì)列,實(shí)現(xiàn)對(duì)數(shù)據(jù)的入隊(duì)和出隊(duì)的管理,這完全可以由現(xiàn)成的Java并發(fā)包中的并發(fā)集合工具類(lèi)實(shí)現(xiàn),不需要自己編寫(xiě)代碼,從而大大提升了程序員的開(kāi)發(fā)效率,避免了程序員自己重復(fù)造輪子的現(xiàn)象。
與此同時(shí),我也收到了很多讀者希望擴(kuò)展或者深入講解某些知識(shí)點(diǎn)的反饋建議,所以決定升級(jí)本書(shū)。
●第3版與第2版的區(qū)別
第3版注重實(shí)戰(zhàn)知識(shí)點(diǎn)的更新,主要是增加了針對(duì)數(shù)據(jù)的組織的第8章(并發(fā)集合工具類(lèi)),以及針對(duì)線(xiàn)程的管理的第9章(Java線(xiàn)程池)。
第8章介紹了并發(fā)集合框架,這是在多線(xiàn)程環(huán)境下使用較多的集合工具類(lèi),它一方面可以大大提升開(kāi)發(fā)者開(kāi)發(fā)多線(xiàn)程應(yīng)用程序的效率,另一方面對(duì)數(shù)據(jù)的組織也更具有規(guī)劃性,能夠滿(mǎn)足高并發(fā)環(huán)境下的使用需求。
第9章增加了線(xiàn)程池的使用,讓線(xiàn)程管理更規(guī)范、高效。線(xiàn)程池也是Java程序員面試必問(wèn)的技術(shù)點(diǎn)。該章深入方法參數(shù)與源代碼層面,講解了有界池和無(wú)界池應(yīng)用,可大大提升讀者開(kāi)發(fā)高性能服務(wù)器的能力。
第3版還增加了若干實(shí)用的技術(shù)點(diǎn)。
第1章中豐富了版JDK中的Thread類(lèi)的API。
第2章中強(qiáng)化了多線(xiàn)程中重要的理論基石柵欄的解釋與代碼實(shí)現(xiàn)。
第3章中增加了以下內(nèi)容:①?volatile關(guān)鍵字在同步與可視性方面的案例,并著重講解了該關(guān)鍵字在使用方面的注意事項(xiàng)及技巧;②?使用并發(fā)包實(shí)現(xiàn)線(xiàn)程間通信的解決方案,以及并發(fā)包中同步鎖的實(shí)現(xiàn)原理;③?線(xiàn)程異步通信機(jī)制的解釋與版JDK實(shí)現(xiàn)代碼。
第5章中優(yōu)化了定時(shí)器相關(guān)的案例,代碼更加簡(jiǎn)潔、明晰。
第7章中細(xì)化了Java線(xiàn)程狀態(tài)的切換。
本書(shū)寫(xiě)作秉承大道至簡(jiǎn)思想,只介紹Java多線(xiàn)程開(kāi)發(fā)中值得關(guān)注的內(nèi)容,希望能拋磚引玉,以個(gè)人的一些想法和見(jiàn)解,為讀者拓展出更深入、更全面的思路。
●本書(shū)特色
在本書(shū)寫(xiě)作的過(guò)程中,我盡量減少啰唆的語(yǔ)言,全部以Demo式案例來(lái)講解技術(shù)點(diǎn)的實(shí)現(xiàn),使讀者看到代碼及運(yùn)行結(jié)果后就可以知道該項(xiàng)目要解決的是什么問(wèn)題,類(lèi)似于網(wǎng)絡(luò)中博客的風(fēng)格,讓讀者用短的時(shí)間學(xué)習(xí)知識(shí)點(diǎn),明白知識(shí)點(diǎn)如何應(yīng)用,以及在使用時(shí)要避免什么,從而快速學(xué)習(xí)并解決問(wèn)題。
●讀者對(duì)象
Java程序員
系統(tǒng)架構(gòu)師
Java多線(xiàn)程開(kāi)發(fā)者
Java并發(fā)開(kāi)發(fā)者
大數(shù)據(jù)開(kāi)發(fā)者
其他對(duì)多線(xiàn)程技術(shù)感興趣的人員
●如何閱讀本書(shū)
本書(shū)本著實(shí)用、易懂的原則,用9章來(lái)介紹Java多線(xiàn)程相關(guān)的技術(shù)。
第1章講解了Java多線(xiàn)程的基礎(chǔ),包括Thread類(lèi)的核心API的使用。
第2章講解了在多線(xiàn)程中對(duì)并發(fā)訪(fǎng)問(wèn)的控制,主要是synchronized關(guān)鍵字的使用。因?yàn)榇岁P(guān)鍵字在使用上非常靈活,所以該章給出很多案例來(lái)說(shuō)明此關(guān)鍵字的用法,為讀者學(xué)習(xí)同步知識(shí)點(diǎn)打好堅(jiān)實(shí)的基礎(chǔ)。
第3章講解了線(xiàn)程之間的通信與交互細(xì)節(jié)。該章主要介紹wait()、notifyAll()和notify()方法的使用,使線(xiàn)程間能互相通信,合作完成任務(wù),還介紹了ThreadLocal類(lèi)的使用,學(xué)習(xí)完該章,讀者就能在Thread多線(xiàn)程中進(jìn)行數(shù)據(jù)的傳遞了。
第4章講解了鎖的使用。因?yàn)閟ynchronized關(guān)鍵字使用起來(lái)比較麻煩,所以Java 5及以上版本中提供了鎖(Lock對(duì)象),更好地實(shí)現(xiàn)了并發(fā)訪(fǎng)問(wèn)時(shí)的同步處理,包括讀寫(xiě)鎖等。
第5章講解了Timer定時(shí)器類(lèi),其內(nèi)部原理就是使用多線(xiàn)程技術(shù)。定時(shí)器是執(zhí)行計(jì)劃任務(wù)時(shí)很重要的技術(shù)點(diǎn),在進(jìn)行Android開(kāi)發(fā)時(shí)也會(huì)有深入的使用。
第6章講解的單例模式雖然很簡(jiǎn)單,但如果遇到多線(xiàn)程將會(huì)變得非常麻煩。如何在多線(xiàn)程中解決這么棘手的問(wèn)題呢?該章會(huì)全面給出解決方案。
第7章對(duì)前面章節(jié)遺漏的技術(shù)空白點(diǎn)進(jìn)行補(bǔ)充,使多線(xiàn)程的知識(shí)體系更加完整。
第8章講解了并發(fā)集合框架的使用,幾乎涵蓋所有主流的并發(fā)集合工具類(lèi),并細(xì)化到API級(jí),包含阻塞和非阻塞的使用等。
第9章講解了線(xiàn)程池的使用,包括讀者應(yīng)該著重掌握的ThreadPool線(xiàn)程池構(gòu)造方法參數(shù)的特性以及其他常用API的使用,并詳細(xì)講解了線(xiàn)程池內(nèi)部源代碼的實(shí)現(xiàn)。
高洪巖
某世界500強(qiáng)公司項(xiàng)目經(jīng)理,有10年Java開(kāi)發(fā)和項(xiàng)目管理經(jīng)驗(yàn),精通Java語(yǔ)言,擅長(zhǎng)Java EE、分布式、微服務(wù)、高性能服務(wù)器架構(gòu)、智能報(bào)表、多線(xiàn)程和高并發(fā)相關(guān)的技術(shù)內(nèi)容,理論與實(shí)踐經(jīng)驗(yàn)頗豐,也積極參與開(kāi)源項(xiàng)目的開(kāi)發(fā)與設(shè)計(jì),涉及Dubbo、Jedis、Pulsar、ZooKeeper等主流開(kāi)源項(xiàng)目。
著有《Java多線(xiàn)程編程核心技術(shù)》《Java并發(fā)編程:核心方法與框架》《NIO與Socket編程技術(shù)指南》《Java EE核心框架實(shí)戰(zhàn)(第2版)》等多本圖書(shū)。
第1章 Java多線(xiàn)程技能 1
1.1 進(jìn)程和線(xiàn)程的定義及多線(xiàn)程的優(yōu)點(diǎn) 1
1.2 使用多線(xiàn)程 5
1.2.1 繼承Thread類(lèi) 6
1.2.2 使用常見(jiàn)的3個(gè)命令分析線(xiàn)程的信息 8
1.2.3 線(xiàn)程隨機(jī)性的展現(xiàn) 10
1.2.4 執(zhí)行start()的順序不代表執(zhí)行run()的順序 12
1.2.5 實(shí)現(xiàn)Runnable接口 14
1.2.6 使用Runnable接口實(shí)現(xiàn)多線(xiàn)程的優(yōu)點(diǎn) 15
1.2.7 public Thread(Runnable target)中的target參數(shù) 16
1.2.8 實(shí)例變量共享導(dǎo)致的非線(xiàn)程安全問(wèn)題與相應(yīng)的解決方案 18
1.2.9 Servlet技術(shù)也會(huì)引起非線(xiàn)程安全問(wèn)題 22
1.2.10 留意i--與System.out.println()出現(xiàn)的非線(xiàn)程安全問(wèn)題 25
1.2.11 方法run()被JVM所調(diào)用 27
1.3 方法currentThread() 27
1.4 方法isAlive() 30
1.5 方法sleep(long millis) 33
1.6 方法sleep(long millis, int nanos) 34
1.7 方法StackTraceElement[] getStack-Trace() 35
1.8 方法static void dumpStack() 36
1.9 方法Map getAllStackTraces() 37
1.10 方法getId() 39
1.11 停止線(xiàn)程 40
1.11.1 停止不了的線(xiàn)程 41
1.11.2 判斷線(xiàn)程是不是停止?fàn)顟B(tài) 42
1.11.3 清除中斷狀態(tài)的使用場(chǎng)景 44
1.11.4 能停止的線(xiàn)程異常法 48
1.11.5 在sleep狀態(tài)下停止 51
1.11.6 使用stop()暴力停止線(xiàn)程 53
1.11.7 方法stop()與java.lang.Thread-Death異常 55
1.11.8 使用stop()釋放鎖導(dǎo)致數(shù)據(jù)結(jié)果不一致 57
1.11.9 使用return;語(yǔ)句停止線(xiàn)程的缺點(diǎn)及相應(yīng)的解決方案 59
1.12 暫停線(xiàn)程 61
1.12.1 方法suspend()與resume()的使用 62
1.12.2 方法suspend()與resume()的缺點(diǎn)獨(dú)占 63
1.12.3 方法suspend()與resume()的缺點(diǎn)數(shù)據(jù)不完整 66
1.12.4 使用LockSupport類(lèi)實(shí)現(xiàn)線(xiàn)程暫停與恢復(fù) 67
1.13 方法yield() 69
1.14 線(xiàn)程的優(yōu)先級(jí) 70
1.14.1 線(xiàn)程優(yōu)先級(jí)的繼承特性 71
1.14.2 線(xiàn)程優(yōu)先級(jí)的規(guī)律性 72
1.14.3 線(xiàn)程優(yōu)先級(jí)的隨機(jī)性 75
1.14.4 看誰(shuí)跑得快 76
1.15 守護(hù)線(xiàn)程 78
1.16 并發(fā)與并行 79
1.17 同步與異步 80
1.18 多核CPU不一定比單核CPU運(yùn)行快 81
1.19 本章小結(jié) 82
第2章 對(duì)象及變量的并發(fā)訪(fǎng)問(wèn) 83
2.1 synchronized同步方法 83
2.1.1 方法內(nèi)的變量是線(xiàn)程安全的 83
2.1.2 實(shí)例變量非線(xiàn)程安全問(wèn)題及解決方案 85
2.1.3 同步synchronized在字節(jié)碼指令中的原理 88
2.1.4 多個(gè)對(duì)象多個(gè)鎖 90
2.1.5 synchronized方法將對(duì)象作為鎖 92
2.1.6 臟讀與解決 97
2.1.7 synchronized鎖重入 99
2.1.8 繼承環(huán)境下的鎖重入 100
2.1.9 出現(xiàn)異常,鎖自動(dòng)釋放 102
2.1.10 非同步方法?:不使用synchronized重寫(xiě)方法 104
2.2 synchronized同步語(yǔ)句塊 106
2.2.1 synchronized方法的弊端 106
2.2.2 synchronized同步代碼塊的使用 109
2.2.3 用同步代碼塊解決同步方法的弊端 111
2.2.4 一半異步,一半同步 112
2.2.5 synchronized代碼塊間的同步性 114
2.2.6 方法println()也是同步的 116
2.2.7 驗(yàn)證synchronized(this)同步代碼塊是鎖定當(dāng)前對(duì)象的 117
2.2.8 將任意對(duì)象作為鎖 119
2.2.9 多個(gè)鎖就是異步執(zhí)行 121
2.2.10 驗(yàn)證方法被調(diào)用是隨機(jī)的 124
2.2.11 不同步導(dǎo)致的邏輯錯(cuò)誤與解決方案 125
2.2.12 細(xì)化驗(yàn)證3個(gè)結(jié)論 129
2.2.13 類(lèi)對(duì)象的單例性 134
2.2.14 靜態(tài)同步?:synchronized方法與synchronized(class)代碼塊 135
2.2.15 同步synchronized方法可以對(duì)類(lèi)的所有對(duì)象實(shí)例起作用 139
2.2.16 同步synchronized(class)代碼塊可以對(duì)類(lèi)的所有對(duì)象實(shí)例起作用 141
2.2.17 String常量池特性與同步問(wèn)題 143
2.2.18 synchronized方法無(wú)限等待問(wèn)題與解決方案 146
2.2.19 多線(xiàn)程的死鎖 148
2.2.20 內(nèi)置類(lèi)與靜態(tài)內(nèi)置類(lèi) 150
2.2.21 內(nèi)置類(lèi)與同步?:實(shí)驗(yàn)1 153
2.2.22 內(nèi)置類(lèi)與同步?:實(shí)驗(yàn)2 155
2.2.23 鎖對(duì)象改變導(dǎo)致異步執(zhí)行 156
2.2.24 鎖對(duì)象不改變依然是同步執(zhí)行 159
2.2.25 同步寫(xiě)法案例比較 161
2.2.26 方法holdsLock(Object obj)的使用 161
2.2.27 臨界區(qū) 162
2.3 volatile關(guān)鍵字 162
2.3.1 可見(jiàn)性的測(cè)試 163
2.3.2 原子性與非原子性的測(cè)試 171
2.3.3 禁止代碼重排序的測(cè)試 179
2.4 本章小結(jié) 190
第3章 線(xiàn)程間通信 191
3.1 wait/ notify機(jī)制 191
3.1.1 不使用wait/notify機(jī)制進(jìn)行通信的缺點(diǎn) 191
3.1.2 什么是wait/notify機(jī)制 194
3.1.3 wait/notify機(jī)制的原理 194
3.1.4 方法wait()的基本用法 195
3.1.5 使用代碼完整實(shí)現(xiàn)wait /notify機(jī)制 196
3.1.6 使用wait/notify機(jī)制實(shí)現(xiàn)線(xiàn)程銷(xiāo)毀 198
3.1.7 對(duì)業(yè)務(wù)代碼進(jìn)行封裝 200
3.1.8 線(xiàn)程狀態(tài)的切換 203
3.1.9 方法wait()導(dǎo)致鎖立即釋放 204
3.1.10 方法sleep()不釋放鎖 206
3.1.11 方法notify()不立即釋放鎖 206
3.1.12 方法interrupt()遇到方法wait() 208
3.1.13 方法notify()只通知一個(gè)線(xiàn)程 210
3.1.14 方法notifyAll()通知所有線(xiàn)程 212
3.1.15 方法wait(long)的基本用法 213
3.1.16 方法wait(long)自動(dòng)向下運(yùn)行的條件 215
3.1.17 通知過(guò)早與相應(yīng)的解決方案 218
3.1.18 等待條件發(fā)生變化 220
3.1.19 生產(chǎn)者/消費(fèi)者模式實(shí)現(xiàn) 224
3.1.20 在管道中傳遞字節(jié)流 239
3.1.21 在管道中傳遞字符流 241
3.1.22 利用wait/notify機(jī)制實(shí)現(xiàn)交叉?zhèn)浞?244
3.1.23 方法sleep()和wait()的區(qū)別 247
3.2 方法join()的使用 247
3.2.1 學(xué)習(xí)方法join()前的鋪墊 247
3.2.2 用方法join()解決問(wèn)題 248
3.2.3 方法join()和interrupt()出現(xiàn)異常 250
3.2.4 方法join(long)的使用 252
3.2.5 方法join(long)與sleep(long)的區(qū)別 254
3.2.6 方法join()后的代碼提前運(yùn)行 257
3.2.7 方法join(long millis, int nanos)的使用 261
3.3 類(lèi)ThreadLocal的使用 262
3.3.1 方法get()與null 262
3.3.2 類(lèi)ThreadLocal存取數(shù)據(jù)流程分析 263
3.3.3 驗(yàn)證線(xiàn)程變量的隔離性 266
3.3.4 解決get()返回null的問(wèn)題 270
3.3.5 驗(yàn)證重寫(xiě)initialValue()方法的隔離性 271
3.3.6 使用remove()方法的必要性 272
3.4 類(lèi)InheritableThreadLocal的使用 276
3.4.1 類(lèi)ThreadLocal不能實(shí)現(xiàn)值繼承 277
3.4.2 使用InheritableThreadLocal體現(xiàn)值繼承特性 278
3.4.3 值繼承特性在源代碼中的執(zhí)行流程 280
3.4.4 父線(xiàn)程有的值,子線(xiàn)程還是舊值?:不可變類(lèi)型 285
3.4.5 子線(xiàn)程有的值,父線(xiàn)程還是舊值?:不可變類(lèi)型 286
3.4.6 子線(xiàn)程可以感應(yīng)對(duì)象屬性值的變化?:可變類(lèi)型 288
3.4.7 重寫(xiě)childValue方法實(shí)現(xiàn)對(duì)繼承值的加工 291
3.5 本章小結(jié) 291
第4章 鎖的使用 292
4.1 使用ReentrantLock類(lèi) 292
4.1.1 使用ReentrantLock實(shí)現(xiàn)同步 292
4.1.2 驗(yàn)證多代碼塊間的同步性 294
4.1.3 方法await()的錯(cuò)誤用法與相應(yīng)的解決方案 297
4.1.4 使用方法await()和方法signal()實(shí)現(xiàn)wait/notify 300
4.1.5 方法await()暫停的原理 302
4.1.6 通知部分線(xiàn)程?:錯(cuò)誤用法 306
4.1.7 通知部分線(xiàn)程?:正確用法 308
4.1.8 實(shí)現(xiàn)生產(chǎn)者/消費(fèi)者模式一對(duì)一交替打印 311
4.1.9 實(shí)現(xiàn)生產(chǎn)者/消費(fèi)者模式多對(duì)多交替打印 313
4.1.10 公平鎖與非公平鎖 315
4.1.11 方法getHoldCount()的使用 318
4.1.12 方法getQueueLength()的使用 319
4.1.13 方法getWaitQueueLength(Condition condition)的使用 321
4.1.14 方法hasQueuedThread(Thread thread)的使用 322
4.1.15 方法hasQueuedThreads()的使用 323
4.1.16 方法hasWaiters(Condition condition)的使用 324
4.1.17 方法isFair()的使用 326
4.1.18 方法isHeldByCurrentThread()的使用 326
4.1.19 方法isLocked()的使用 327
4.1.20 方法lockInterruptibly()的使用 328
4.1.21 方法tryLock()的使用 330
4.1.22 方法tryLock(long timeout, Time-Unit unit)的使用 331
4.1.23 方法await(long time, TimeUnit unit)的使用 333
4.1.24 方法awaitNanos(long nanos-Timeout)的使用 334
4.1.25 方法awaitUntil(Date deadline)的使用 335
4.1.26 方法awaitUninterruptibly()的使用 337
4.1.27 實(shí)現(xiàn)線(xiàn)程按順序執(zhí)行業(yè)務(wù) 339
4.2 使用ReentrantReadWriteLock類(lèi) 342
4.2.1 類(lèi)ReentrantLock的缺點(diǎn) 342
4.2.2 讀讀共享 344
4.2.3 寫(xiě)寫(xiě)互斥 344
4.2.4 讀寫(xiě)互斥 345
4.2.5 寫(xiě)讀互斥 346
4.3 本章小結(jié) 347
第5章 定時(shí)器 348
5.1 定時(shí)器的使用 348
5.1.1 方法schedule(TimerTask task, Date time)的測(cè)試 349
5.1.2 方法schedule(TimerTask task, Date f?irstTime, long period)的測(cè)試 357
5.1.3 方法schedule(TimerTask task, long delay)的測(cè)試 365
5.1.4 方法schedule(TimerTask task, long delay, long period)的測(cè)試 365
5.1.5 方法scheduleAtFixedRate(TimerTask task, Date f?irst-Time, long period)的測(cè)試 366
5.2 本章小結(jié) 374
第6章 單例模式與多線(xiàn)程 375
6.1 單例模式與多線(xiàn)程 375
6.1.1 立即加載/餓漢模式 375
6.1.2 延遲加載/懶漢模式 377
6.1.3 使用靜態(tài)內(nèi)置類(lèi)實(shí)現(xiàn)單例模式 388
6.1.4 序列化與反序列化的單例模式實(shí)現(xiàn) 389
6.1.5 使用static代碼塊實(shí)現(xiàn)單例模式 392
6.1.6 使用enum枚舉數(shù)據(jù)類(lèi)型實(shí)現(xiàn)單例模式 393
6.1.7 完善使用enum枚舉實(shí)現(xiàn)單例模式 394
6.2 本章小結(jié) 396
第7章 拾遺增補(bǔ) 397
7.1 線(xiàn)程的狀態(tài) 397
7.1.1 驗(yàn)證NEW、RUNNABLE和TERMINATED 399
7.1.2 驗(yàn)證TIMED_WAITING 400
7.1.3 驗(yàn)證BLOCKED 401
7.1.4 驗(yàn)證WAITING 403
7.2 線(xiàn)程組 404
7.2.1 線(xiàn)程對(duì)象關(guān)聯(lián)線(xiàn)程組?:一級(jí)關(guān)聯(lián) 404
7.2.2 線(xiàn)程對(duì)象關(guān)聯(lián)線(xiàn)程組?:多級(jí)關(guān)聯(lián) 406
7.2.3 線(xiàn)程組自動(dòng)歸屬特性 407
7.2.4 獲取根線(xiàn)程組 408
7.2.5 線(xiàn)程組內(nèi)加線(xiàn)程組 409
7.2.6 組內(nèi)的線(xiàn)程批量停止 409
7.2.7 遞歸取得與非遞歸取得組內(nèi)對(duì)象 410
7.3 Thread.activeCount()方法的使用 412
7.4 Thread.enumerate(Thread tarray[])方法的使用 412
7.5 再次驗(yàn)證線(xiàn)程執(zhí)行有序性 412
7.6 類(lèi)SimpleDateFormat非線(xiàn)程安全 414
7.6.1 出現(xiàn)異常 415
7.6.2 解決方法1 417
7.6.3 解決方法2 418
7.7 線(xiàn)程中出現(xiàn)異常的處理 420
7.7.1 線(xiàn)程出現(xiàn)異常的默認(rèn)行為 420
7.7.2 使用setUncaughtException-Handler()方法進(jìn)行異常處理 421
7.7.3 使用setDefaultUncaught-ExceptionHandler()方法進(jìn)行異常處理 422
7.8 線(xiàn)程組內(nèi)處理異常 423
7.9 線(xiàn)程異常處理的優(yōu)先性 426
7.10 本章小結(jié) 431
第8章 并發(fā)集合框架 432
8.1 集合框架結(jié)構(gòu) 432
8.1.1 接口Iterable 432
8.1.2 接口Collection 432
8.1.3 接口List 433
8.1.4 接口Set 434
8.1.5 接口Queue 435
8.1.6 接口Deque 435
8.2 非阻塞隊(duì)列 435
8.2.1 類(lèi)ConcurrentHashMap的使用 436
8.2.2 類(lèi)ConcurrentSkipListMap的使用 442
8.2.3 類(lèi)ConcurrentSkipListSet的使用 444
8.2.4 類(lèi)ConcurrentLinkedQueue的使用 447
8.2.5 類(lèi)ConcurrentLinkedDeque的使用 451
8.2.6 類(lèi)CopyOnWriteArrayList的使用 453
8.2.7 類(lèi)CopyOnWriteArraySet的使用 454
8.3 阻塞隊(duì)列 456
8.3.1 類(lèi)ArrayBlockingQueue與公平/非公平鎖的使用 456
8.3.2 類(lèi)PriorityBlockingQueue的使用 461
8.3.3 類(lèi)LinkedBlockingQueue的使用 463
8.3.4 類(lèi)LinkedBlockingDeque的使用 463
8.3.5 類(lèi)SynchronousQueue的使用 463
8.3.6 類(lèi)DelayQueue的使用 466
8.3.7 類(lèi)LinkedTransferQueue的使用 467
8.4 本章小結(jié) 476
第9章 線(xiàn)程池類(lèi)ThreadPoolExecutor的使用 477
9.1 Executor接口介紹 477
9.2 使用Executors工廠(chǎng)類(lèi)創(chuàng)建線(xiàn)程池 481
9.2.1 使用newCachedThreadPool()方法創(chuàng)建無(wú)界線(xiàn)程池 481
9.2.2 驗(yàn)證newCachedThreadPool()方法創(chuàng)建線(xiàn)程池和線(xiàn)程復(fù)用特性 483
9.2.3 使用newCachedThreadPool (ThreadFactory)方法定制線(xiàn)程工廠(chǎng) 486
9.2.4 使用newCachedThread-Pool()方法創(chuàng)建無(wú)界線(xiàn)程池的缺點(diǎn) 487
9.2.5 使用newFixedThreadPool(int)
方法創(chuàng)建有界線(xiàn)程池 488
9.2.6 使用newSingleThread-Executor()方法創(chuàng)建單一線(xiàn)程池 490
9.3 ThreadPoolExecutor類(lèi)的使用 491
9.3.1 隊(duì)列LinkedBlocking-Queue、ArrayBlocking-Queue和Synchronous-Queue的基本使用 491
9.3.2 構(gòu)造方法參數(shù)詳解 495
9.3.3 方法shutdown()和shutdownNow() 521
9.3.4 方法List shutdown-Now()返回值的作用 525
9.3.5 方法shutdown()和shutdown-Now()與中斷 527
9.3.6 方法isShutdown() 529
9.3.7 方法isTerminating()和isTerminated() 530
9.3.8 方法awaitTermination(long timeout,TimeUnit unit) 531
9.3.9 工廠(chǎng)ThreadFactory Thread UncaughtExceptionHandler處理異常 533
9.3.10 方法set/getRejected-ExecutionHandler() 537
9.3.11 方法allowsCoreThreadTime-Out和allowCoreThreadTime-Out(bool) 539
9.3.12 方法prestartCoreThread()和prestartAllCoreThreads() 541
9.3.13 方法getCompletedTask-Count() 542
9.3.14 線(xiàn)程池ThreadPoolExecutor的拒絕策略 543
9.3.15 方法afterExecute()和beforeExecute() 549
9.3.16 方法remove(Runnable)的使用 551
9.3.17 多個(gè)get方法的測(cè)試 555
9.4 本章小結(jié) 558