本書是一本關(guān)于并發(fā)編程技術(shù)的教程,書中詳細介紹了并發(fā)編程中的主要概念和基本數(shù)據(jù)結(jié)構(gòu),包括傳統(tǒng)并發(fā)模型、基于Future 和Promise的異步編程、數(shù)據(jù)并行容器、基于響應式擴展的并發(fā)編程、軟件事務性內(nèi)存、角色模型、并發(fā)編程實踐和反應器編程模型等。本書基于Scala語言編寫,實例豐富,可操作性很強。
本書面向的用戶群體以Scala用戶為主,因為書中所有的示例都是基于Scala代碼的。但其他語言用戶也可以從中獲益良多,因為書中介紹的并發(fā)編程概念是普遍適用的,并不局限于特定編程語言,只不過Scala比較適用于并發(fā)編程而已。
1.本書由Scala發(fā)明人親傳弟子執(zhí)筆完成,頗具權(quán)威性。
2.通過大量的實際案例,兼顧理論與實踐,帶領(lǐng)讀者熟悉并發(fā)領(lǐng)域的尖端技術(shù)。
3.提供代碼下載,且代碼可重用。
Scala是一種現(xiàn)代的多范式編程語言,旨在以簡潔、優(yōu)雅和安全的方式表達常見的編程模式。Scala流暢地集成了面向?qū)ο笳Z言和函數(shù)式語言的特性。
在本書中,您會看到Scala 2.12平臺的更新內(nèi)容(Scala 2.12系列針對Java 8執(zhí)行程序)。本書首先向您介紹JVM并發(fā)編程的基礎(chǔ),概述了Java內(nèi)存模型的基本知識,然后展示了一些經(jīng)典的構(gòu)建塊的并發(fā)性,如原子性變量、線程池和并發(fā)數(shù)據(jù)結(jié)構(gòu),以及對傳統(tǒng)并發(fā)性的說明。
接著,本書介紹了不同的高級并發(fā)抽象,每種抽象都針對特定的編程任務類,同時還介紹了Scala異步編程功能的演進,涵蓋了一些與所描述的技術(shù)配套使用的有效模式和習慣用法。最后,本書概述了何時使用哪個并發(fā)庫,并演示了它們協(xié)同工作的方法,同時介紹了構(gòu)建并發(fā)和分布式系統(tǒng)的全新方法。
目標讀者
不管是Scala并發(fā)編程的初學者,還是具備一定經(jīng)驗的Scala編程人員,通過閱讀本書,相信您都會有所收獲。當然,具備Scala編程語言的基本知識將對閱讀本書很有幫助。
您將從這本書中學到什么:
■ 掌握現(xiàn)代多處理器系統(tǒng)并發(fā)編程的基礎(chǔ);
■ 通過簡單的低級并發(fā)原語構(gòu)建高性能并發(fā)系統(tǒng);
■ 基于Future和Promise來表現(xiàn)并發(fā)計算中的異步性;
■ 通過使用數(shù)據(jù)并行容器來無縫地加速串行編程;
■ 設(shè)計安全、可擴展且易于理解的內(nèi)存事務數(shù)據(jù)模型;
■ 創(chuàng)建可在多臺計算機上擴展的分布式應用程序;
■ 在大型應用程序中集成不同的并發(fā)框架;
■ 在Scala 2.12中開發(fā)和實施可擴展且易于理解的并發(fā)應用程序。
Aleksandar Prokopec 是一位軟件開發(fā)者,同時也是并發(fā)和分布式編程技術(shù)研究者。他擁有克羅地亞薩格勒布大學電子工程和計算學院的計算機專業(yè)碩士學位和瑞士洛桑聯(lián)邦理工大學(EPFL)的計算機科學專業(yè)博士學位。作為 EPFL 博士助教和 Scala 語言開發(fā)團隊成員,他積極為 Scala 編程語言做貢獻,研究并發(fā)編程抽象、并行數(shù)據(jù)編程支持和 Scala并發(fā)數(shù)據(jù)結(jié)構(gòu)。他編寫了 Scala Parallel Collections 框架,這是一個高級的 Scala 并行數(shù)據(jù)編程庫。他還參加了多個 Scala 并發(fā)庫開發(fā)小組,開發(fā)了 Future、Promise 和 ScalaSTM 等抽象。
第 1章 概述 1
1.1 并發(fā)編程 2
1.1.1 傳統(tǒng)并發(fā)計算概述 2
1.1.2 現(xiàn)代并發(fā)編程范式 3
1.2 Scala的優(yōu)勢 4
1.3 準備工作 5
1.3.1 執(zhí)行一個Scala程序 5
1.3.2 初識Scala 6
1.4 小結(jié) 10
1.5 練習 11
第 2章 JVM和JMM上的并發(fā)性 13
2.1 進程和線程 14
2.1.1 線程的創(chuàng)建和啟動 16
2.1.2 原子執(zhí)行 20
2.1.3 重排序 24
2.2 監(jiān)控器和同步 26
2.2.1 死鎖 28
2.2.2 保護塊 30
2.2.3 線程中斷和平滑關(guān)閉 34
2.3 易失變量 35
2.4 JMM 37
2.5 小結(jié) 40
2.6 練習 41
第3章 并發(fā)編程的傳統(tǒng)構(gòu)造模塊 45
3.1 Executor和ExecutionContext對象 46
3.2 原子性原語 49
3.2.1 原子性變量 49
3.2.2 無鎖編程 52
3.2.3 鎖的實現(xiàn) 54
3.2.4 ABA問題 56
3.3 懶值 58
3.4 并發(fā)容器 62
3.4.1 并發(fā)隊列 64
3.4.2 并發(fā)集合和映射 66
3.4.3 并發(fā)遍歷 71
3.5 定制的并發(fā)數(shù)據(jù)結(jié)構(gòu) 73
3.5.1 實現(xiàn)一個無鎖的并發(fā)池 74
3.5.2 進程的創(chuàng)建和處理 78
3.6 小結(jié) 79
3.7 練習 80
第4章 基于Future和Promise的異步編程 82
4.1 Future 83
4.1.1 啟動Future計算 84
4.1.2 Future回調(diào) 86
4.1.3 Future和異!88
4.1.4 使用Try類型 89
4.1.5 致命異!90
4.1.6 Future上的函數(shù)式組合 91
4.2 Promise 98
4.2.1 包裝基于回調(diào)的API 100
4.2.2 擴展Future API 102
4.2.3 異步計算的取消 103
4.3 Future和阻塞 106
4.3.1 等待Future完成 106
4.3.2 在異步計算內(nèi)部阻塞 107
4.4 Scala的Async庫 108
4.5 其他Future框架 110
4.6 小結(jié) 112
4.7 練習 112
第5章 數(shù)據(jù)并行容器 116
5.1 Scala容器概述 117
5.2 使用并行容器 117
5.2.1 并行容器的類繼承譜系 121
5.2.2 配置并行層次 122
5.2.3 測量JVM上的性能 123
5.3 并行容器的缺點 125
5.3.1 不可并行容器 125
5.3.2 不可并行操作 126
5.3.3 并行操作中的副作用 128
5.3.4 非確定性的并行操作 129
5.3.5 可交換和可結(jié)合的操作 131
5.4 將并行容器和并發(fā)容器結(jié)合起來 132
5.5 實現(xiàn)定制的并行容器 134
5.5.1 分裂器 135
5.5.2 組合器 138
5.6 小結(jié) 141
5.7 練習 142
第6章 基于響應式擴展的并發(fā)編程 143
6.1 創(chuàng)建Observable對象 144
6.1.1 Observable對象和異常 146
6.1.2 Observable規(guī)約 147
6.1.3 定制Observable對象 149
6.1.4 由Future對象創(chuàng)建Observable對象 150
6.1.5 訂閱 151
6.2 Observable對象的組合 154
6.2.1 嵌套Observable對象 155
6.2.2 Observable對象的錯誤處理 160
6.3 Rx調(diào)度器 163
6.4 Subject和自頂向下響應式編程 169
6.5 小結(jié) 173
6.6 練習 174
第7章 軟件事務性內(nèi)存 176
7.1 原子性變量的問題 177
7.2 使用STM 180
7.2.1 事務性引用 182
7.2.2 使用atomic語句 183
7.3 事務的組合 185
7.3.1 事務間的交互和副作用 185
7.3.2 單操作事務 189
7.3.3 嵌套的事務 190
7.3.4 事務和異!193
7.4 事務的重試 197
7.5 事務性容器 202
7.5.1 事務局部變量 202
7.5.2 事務性數(shù)組 203
7.5.3 事務性映射 205
7.6 小結(jié) 206
7.7 練習 207
第8章 角色模型 210
8.1 使用角色模型 211
8.1.1 創(chuàng)建角色系統(tǒng)和角色實例 213
8.1.2 未處理消息的管理 216
8.1.3 角色行為和狀態(tài) 217
8.1.4 Akka角色的層次關(guān)系 221
8.1.5 角色的查找 224
8.1.6 角色的生命周期 226
8.2 角色之間的通信 230
8.2.1 ask模式 231
8.2.2 轉(zhuǎn)發(fā)模式 234
8.2.3 角色終止 235
8.3 角色的監(jiān)管 237
8.4 遠程角色 242
8.5 小結(jié) 246
8.6 練習 246
第9章 并發(fā)編程實踐 248
9.1 選擇并發(fā)性編程的正確工具 248
9.2 將所有工具組合起來——編寫一個遠程文件瀏覽器 252
9.2.1 文件系統(tǒng)建!253
9.2.2 服務器接口 256
9.2.3 客戶端API 258
9.2.4 客戶端程序的用戶界面 261
9.2.5 實現(xiàn)客戶端邏輯 265
9.2.6 改進遠程文件瀏覽器 270
9.3 調(diào)試并發(fā)性程序 271
9.3.1 死鎖和沒有進度 272
9.3.2 程序錯誤輸出的調(diào)試 276
9.3.3 性能調(diào)優(yōu) 280
9.4 小結(jié) 286
9.5 練習 286
第 10章 反應器編程模型 289
10.1 對反應器的需求 290
10.2 開始使用Reactor 291
10.3 Hello World程序 291
10.4 事件流 293
10.4.1 事件流的生命周期 294
10.4.2 事件流的函數(shù)式組合 295
10.5 反應器 297
10.5.1 反應器的定義和配置 299
10.5.2 使用通道 300
10.6 調(diào)度器 302
10.7 反應器生命周期 304
10.8 反應器系統(tǒng)服務 305
10.8.1 日志服務 306
10.8.2 時鐘服務 306
10.8.3 Channels服務 307
10.8.4 定制服務 309
10.9 協(xié)議 310
10.9.1 定制一個服務器—客戶端協(xié)議 311
10.9.2 標準服務器—客戶端協(xié)議 313
10.9.3 路由協(xié)議 316
10.9.4 兩路協(xié)議 318
10.10 小結(jié) 321
10.11 練習 321