本書通過具體的Java 程序,以淺顯易懂的語言逐一說明了多線程和并發處理中常用的12 種設計模式。內容涉及線程的基礎知識、線程的啟動與終止、線程間的互斥處理與協作、線程的有效應用、線程的數量管理以及性能優化的注意事項等。此外,還介紹了一些多線程編程時容易出現的失誤,以及多線程程序的閱讀技巧等。在講解過程中,不僅以圖配文,理論結合實例,而且提供了運用模式解決具體問題的練習題和答案,幫助讀者加深對多線程和并發處理的理解,并掌握其使用技巧。
精選12種與多線程和并發處理相關的設計模式
264張圖表 300段Java示例程序 = 輕松學習多線程編程
日本經典多線程入門書,原版長銷11年!
1.圖文并茂 通俗易懂
日本資-深技術作家、《程序員的數學》作者結城浩執筆,264張圖表(UML類圖、時序圖、Timethreads圖等)穿插文中,通過類比手法和淺顯的語言,逐一講解與多線程和并發處理相關的12種設計模式。每章附帶練習題和答案,自學者也可輕松學習
2.專業實用 拓展進階
編寫了300個示例程序來實現設計模式,掌握這些設計模式可以避免程序發生死鎖、節省資源、提高性能等,讓多線程程序更高效。java.util.concurrent包、synchronized關鍵字、Swing框架、Java內存模型等內容也均有涉及,不僅能夠了解Java多線程的相關知識,還可加深對Java語言的理解。
本書適合以下讀者閱讀
a.對多線程感興趣的人
b.對Java編程感興趣的人
c.對設計模式感興趣的人
d.對面向對象開發感興趣的人
結城浩(作者)
生于1963年,日本資-深技術作家和程序員。在編程語言、設計模式、數學、加密技術等領域,編寫了很多深受歡迎的入門書。代表作有《數學女孩》系列、《程序員的數學》、《圖解密碼技術》等。
侯振龍(譯者)
管理科學與工程專業碩士,日語一級,軟件開發工程師,具有十年對日軟件開發經驗,現就職于某日本獨資企業。
楊文軒(譯者)
華中科技大學碩士,擅長Web 2.0開發,有豐富的對日開發經驗。現就職于日本方正股份有限公司。譯作有《圖解基礎設施設計模式》《C現代編程:集成開發環境、設計模式、極限編程、測試驅動開發、重構、持續集成》及《圖解設計模式》。
序章1Java線程1
I1.1Java線程2
I1.2何謂線程2
明為跟蹤處理流程,實為跟蹤線程2
單線程程序3
多線程程序4
Thread類的run方法和start方法5
I1.3線程的啟動9
線程的啟動(1)利用Thread類的子類9
線程的啟動(2)利用Runnable接口10
I1.4線程的暫停12
I1.5線程的互斥處理13
synchronized方法14
synchronized代碼塊17
I1.6線程的協作18
等待隊列線程休息室19
wait方法將線程放入等待隊列19
notify方法從等待隊列中取出線程21
notifyAll方法從等待隊列中取出所有線程23
wait、notify、notifyAll是Object類的方法24
I1.7線程的狀態遷移24
I1.8線程相關的其他話題26
I1.9本章所學知識26
I1.10練習題26
序章2多線程程序的評價標準31
I2.1多線程程序的評價標準32
安全性不損壞對象32
生存性必要的處理能夠被執行32
可復用性類可重復利用33
性能能快速、大批量地執行處理33
評價標準總結33
I2.2本章所學知識34
I2.3練習題34
第1章Single Threaded Execution模式能通過這座橋的只有一個人35
1.1Single Threaded Execution模式36
1.2示例程序1:不使用Single Threaded Execution模式的程序36
Main類37
非線程安全的Gate類37
UserThread類38
執行起來看看……出錯了39
為什么會出錯呢40
1.3示例程序2:使用Single Threaded Execution模式的程序41
線程安全的Gate類41
synchronized的作用42
1.4Single Threaded Execution模式中的登場角色43
1.5拓展思路的要點44
何時使用(可使用Single Threaded Execution模式的情況)44
生存性與死鎖45
可復用性和繼承反常46
臨界區的大小和性能46
1.6相關的設計模式47
Guarded Suspension模式47
Read-Write Lock模式47
Immutable模式47
Thread-Specific Storage模式48
1.7延伸閱讀1:關于synchronized48
synchronized語法與Before/After模式48
synchronized在保護著什么49
該以什么單位來保護呢50
使用哪個鎖保護50
原子操作51
long與double的操作不是原子的51
1.8延伸閱讀2:java.util.concurrent包和計數信號量52
計數信號量和Semaphore類52
使用Semaphore類的示例程序52
1.9本章所學知識55
1.10練習題55
第2章Immutable模式想破壞也破壞不了61
2.1Immutable模式62
2.2示例程序62
使用Immutable模式的Person類62
Main類63
PrintPersonThread類63
2.3Immutable模式中的登場角色65
2.4拓展思路的要點66
何時使用(可使用Immutable模式的情況)66
考慮成對的mutable類和immutable類 [性能]66
為了確保不可變性 [可復用性]67
標準類庫中用到的Immutable模式67
2.5相關的設計模式69
Single Threaded Execution模式69
Read-Write Lock模式69
Flyweight模式69
2.6延伸閱讀1:final69
final的含義69
2.7延伸閱讀2:集合類與多線程71
示例1:非線程安全的java.util.ArrayList類71
示例2:利用Collections.synchronizedList方法所進行的同步74
示例3:使用copy-on-write的java.util.concurrent.CopyOnWriteArrayList類75
2.8本章所學知識76
2.9練習題77
第3章Guarded Suspension模式等我準備好哦81
3.1Guarded Suspension模式82
3.2示例程序82
Request類83
RequestQueue類84
ClientThread類85
ServerThread類85
Main類86
java.util.Queue與java.util.LinkedList的操作87
getRequest詳解87
putRequest詳解89
synchronized的含義89
wait與鎖89
3.3Guarded Suspension模式中的登場角色90
3.4拓展思路的要點91
附加條件的synchronized91
多線程版本的if91
忘記改變狀態與生存性91
wait與notify/notifyAll的責任 [可復用性]91
各種稱呼91
使用java.util.concurrent.LinkedBlockingQueue的示例程序93
3.5相關的設計模式94
Single Threaded Execution模式94
Balking模式94
Producer-Consumer模式94
Future模式94
3.6本章所學知識95
3.7練習題95
第4章Balking模式不需要就算了99
4.1Balking模式100
4.2示例程序100
Data類100
SaverThread類102
ChangerThread類102
Main類103
4.3Balking模式中的登場角色105
4.4拓展思路的要點106
何時使用(可使用Balking模式的情況)106
balk結果的表示方式107
4.5相關的設計模式107
Guarded Suspension模式107
Observer模式107
4.6延伸閱讀:超時108
Balking模式和Guarded Suspension模式之間108
wait何時終止呢108
guarded timed的實現(使用wait)109
synchronized中沒有超時,也不能中斷110
java.util.concurrent中的超時111
4.7 本章所學知識111
4.8 練習題112
第5章Producer-Consumer模式我來做,你來用115
5.1Producer-Consumer模式116
5.2示例程序116
Main類116
MakerThread類117
EaterThread類118
Table類118
解讀put方法120
解讀take方法121
5.3Producer-Consumer模式中的登場角色122
5.4拓展思路的要點123
守護安全性的Channel角色(可復用性)123
不可以直接傳遞嗎124
Channel角色的剩余空間所導致的問題124
以什么順序傳遞Data角色呢125
存在中間角色的意義125
Consumer角色只有一個時會怎么樣呢126
5.5相關的設計模式126
Mediator模式126
Worker Thread模式126
Command模式126
Strategy模式127
5.6延伸閱讀1:理解InterruptedException異常127
可能會花費時間,但可以取消127
加了throws InterruptedException的方法127
sleep方法和interrupt方法128
wait方法和interrupt方法128
join方法和interrupt方法129
interrupt方法只是改變中斷狀態129
isInterrupted方法檢查中斷狀態130
Thread.interrupted方法檢查并清除中斷狀態130
不可以使用Thread類的stop方法130
5.7延伸閱讀2:java.util.concurrent包和Producer-Consumer模式131
java.util.concurrent包中的隊列131
使用java.util.concurrent.ArrayBlockingQueue的示例程序132
使用java.util.concurrent.Exchanger類交換緩沖區133
5.8本章所學知識136
5.9練習題137
第6章Read-Write Lock模式大家一起讀沒問題,但讀的時候不要寫哦141
6.1Read-Write Lock模式142
6.2示例程序142
Main類143
Data類143
WriterThread類146
ReaderThread類146
ReadWriteLock類147
執行起來看看149
守護條件的確認150
6.3Read-Write Lock模式中的登場角色151
6.4拓展思路的要點153
利用讀取操作的線程之間不會沖突的特性來提高程序性能153
適合讀取操作繁重時153
適合讀取頻率比寫入頻率高時153
鎖的含義153
6.5相關的設計模式154
Immutable模式154
Single Threaded Execution模式154
Guarded Suspension模式154
Before/After模式154
Strategized Locking模式154
6.6延伸閱讀:java.util.concurrent.locks包和Read-Write Lock模式154
java.util.concurrent.locks包154
使用java.util.concurrent.locks的示例程序155
6.7本章所學知識156
6.8練習題157
第7章Thread-Per-Message模式這項工作就交給你了163
7.1Thread-Per-Message模式164
7.2示例程序164
Main類164
Host類165
Helper類166
7.3Thread-Per-Message模式中的登場角色168
7.4拓展思路的要點169
提高響應性,縮短延遲時間169
適用于操作順序沒有要求時169
適用于不需要返回值時169
應用于服務器169
調用方法+啟動線程發送消息170
7.5相關的設計模式170
Future模式170
Worker Thread模式170
7.6延伸閱讀1:進程與線程171
7.7延伸閱讀2:java.util.concurrent包和Thread-Per-Message模式171
java.lang.Thread類171
java.lang.Runnable接口172
java.util.concurrent.ThreadFactory接口173
java.util.concurrent.Executors類獲取的ThreadFactory174
java.util.concurrent.Executor接口175
java.util.concurrent.ExecutorService接口176
java.util.concurrent.ScheduledExecutorService類177
總結178
7.8本章所學知識180
7.9練習題180
第8章Worker Thread模式工作沒來就一直等,工作來了就干活187
8.1Worker Thread模式188
8.2示例程序188
Main類189
ClientThread類190
Request類190
Channel類191
WorkerThread類192
8.3Worker Thread模式中的登場角色193
8.4拓展思路的要點195
提高吞吐量195
容量控制195
調用與執行的分離196
Runnable接口的意義197
多態的Request角色198
獨自一人的Worker角色199
8.5相關的設計模式199
Producer-Consumer模式199
Thread-Per-Message模式199
Command模式199
Future模式199
Flyweight模式199
Thread-Specific Storage模式200
Active Ojbect模式200
8.6延伸閱讀1:Swing事件分發線程200
什么是事件分發線程200
事件分發線程只有一個200
事件分發線程調用監聽器201
注冊監聽器的意義201
事件分發線程也負責繪制界面201
javax.swing.SwingUtilities類202
Swing的單線程規則203
8.7延伸閱讀2:java.util.concurrent包和Worker Thread模式204
ThreadPoolExecutor類204
通過java.util.concurrent包創建線程池205
8.8本章所學知識207
8.9練習題208
第9章Future模式先給您提貨單211
9.1Future模式212
9.2示例程序212
Main類214
Host類214
Data接口215
FutureData類216
RealData類217
9.3Future模式中的登場角色218
9.4拓展思路的要點219
吞吐量會提高嗎219
異步方法調用的返回值220
準備返回值和使用返回值的分離220
變種不讓主線程久等的Future角色220
變種會發生變化的Future角色221
誰會在意多線程呢?可復用性221
回調與Future模式221
9.5相關的設計模式222
Thread-Per-Message模式222
Builder模式222
Proxy模式222
Guarded Suspension模式222
Balking模式222
9.6延伸閱讀:java.util.concurrent包與Future模式222
java.util.concurrent包222
使用了java.util.concurrent包的示例程序223
9.7本章所學知識226
9.8練習題226
第10章Two-Phase Termination模式先收拾房間再睡覺231
10.1Two-Phase Termination模式232
10.2示例程序233
CountupThread類234
Main類236
10.3Two-Phase Termination模式中的登場角色237
10.4拓展思路的要點238
不能使用Thread類的stop方法238
僅僅檢查標志是不夠的239
僅僅檢查中斷狀態是不夠的239
在長時間處理前檢查終止請求239
join方法和isAlive方法240
java.util.concurrent.ExecutorService接口與Two-Phase Termination模式240
要捕獲程序整體的終止時241
優雅地終止線程243
10.5相關的設計模式243
Before/After模式243
Multiphase Cancellation模式243
Multi-Phase Startup模式244
Balking模式244
10.6延伸閱讀1:中斷狀態與InterruptedException異常的相互轉換244
中斷狀態InterruptedException異常的轉換244
InterruptedException異常中斷狀態的轉換245
InterruptedException異常InterruptedException異常的轉換245
10.7延伸閱讀2:java.util.concurrent包與線程同步246
java.util.concurrent.CountDownLatch類246
java.util.concurrent.CyclicBarrier類249
10.8本章所學知識253
10.9練習題253
第11章Thread-Specific Storage模式一個線程一個儲物柜263
11.1Thread-Specific Storage模式264
11.2關于java.lang.ThreadLocal類264
java.lang.ThreadLocal就是儲物間264
java.lang.ThreadLocal與泛型265
11.3示例程序1:不使用Thread-Specific Storage模式的示例265
Log類266
Main類266
11.4示例程序2:使用了Thread-Specific Storage模式的示例267
線程特有的TSLog類268
Log類269
ClientThread類270
Main類271
11.5Thread-Specific Storage模式中的登場角色272
11.6拓展思路的要點274
局部變量與java.lang.ThreadLocal類274
保存線程特有的信息的位置275
不必擔心其他線程訪問275
吞吐量的提高很大程序上取決于實現方式276
上下文的危險性276
11.7相關的設計模式277
Singleton模式277
Worker Thread模式277
Single Threaded Execution模式277
Proxy模式277
11.8 延伸閱讀:基于角色與基于任務277
主體與客體277
基于角色的考慮方式278
基于任務的考慮方式278
實際上兩種方式是綜合在一起的279
11.9本章所學知識279
11.10練習題280
第12章Active Object模式接收異步消息的主動對象283
12.1Active Object模式284
12.2示例程序1284
調用方:Main類287
調用方:MakerClientThread類288
調用方:DisplayClientThread類289
主動對象方:ActiveObject接口289
主動對象方:ActiveObjectFactory類290
主動對象方:Proxy類290
主動對象方:SchedulerThread類291
主動對象方:ActivationQueue類292
主動對象方:MethodRequest類293
主動對象方:MakeStringRequest類294
主動對象方:DisplayStringRequest類295
主動對象方:Result類295
主動對象方:FutureResult類296
主動對象方:RealResult類296
主動對象方:Servant類297
示例程序1的運行297
12.3ActiveObject模式中的登場角色298
12.4拓展思路的要點304
到底做了些什么事情304
運用模式時需要考慮問題的粒度304
關于并發性304
增加方法305
Scheduler角色的作用305
主動對象之間的交互306
通往分布式從跨越線程界線變為跨越計算機界線306
12.5相關的設計模式306
Producer-Consumer模式306
Future模式307
Worker Thread模式307
Thread-Specific Storage模式307
12.6延伸閱讀:java.util.concurrent包與Active Object模式307
類與接口307
調用方:Main類309
調用方:MakerClientThread類309
調用方:DisplayClientThread類310
主動對象方:ActiveObject接口311
主動對象方:ActiveObjectFactory類311
主動對象:ActiveObjectImpl類312
示例程序2的運行313
12.7本章所學知識314
12.8練習題315
第13章總結多線程編程的模式語言321
13.1多線程編程的模式語言322
模式與模式語言322
13.2Single Threaded Execution模式
能通過這座橋的只有一個人323
13.3 Immutable模式
想破壞也破壞不了324
13.4 Guarded Suspension模式
等我準備好哦325
13.5 Balking模式
不需要就算了326
13.6 Producer-Consumer模式
我來做,你來用327
13.7 Read-Write Lock模式
大家一起讀沒問題,但讀的時候不要寫哦328
13.8 Thread-Per-Message模式
這項工作就交給你了329
13.9 Worker Thread模式
工作沒來就一直等,工作來了就干活330
13.10Future模式
先給您提貨單330
13.11Two-Phase Termination模式
先收拾房間再睡覺331
13.12Thread-Specific Storage模式
一個線程一個儲物柜332
13.13Active Object模式
接收異步消息的主動對象333
13.14寫在最后335
附錄337
附錄A 習題解答338
附錄B Java內存模型447
附錄C Java線程的優先級467
附錄D 線程相關的主要API469
附錄E java.util.concurrent包475
附錄F 示例程序的運行步驟483
附錄G 參考文獻485