實戰Java高並發程式設計(第3版)

《實戰Java高並發程式設計(第3版)》是2022年7月電子工業出版社出版的圖書,作者是葛一鳴。

詳解Java高並發程式設計基礎、思路、方法和實戰。

基本介紹

  • 中文名:實戰Java高並發程式設計(第3版
  • 作者:葛一鳴
  • 出版社:電子工業出版社
  • 出版時間:2022年7月
  • 頁數:428 頁
  • 定價:99 元
  • 開本:16 開
  • ISBN:9787121437076
內容簡介,圖書目錄,作者簡介,

內容簡介

《實戰Java高並發程式設計(第3版)》主要介紹基於Java的並行程式設計基礎、思路、方法和實戰。第一,立足於並行程式基礎,詳細介紹Java並行程式設計的基本方法。第二,進一步詳細介紹JDK對並行程式的強大支持,幫助讀者快速、穩健地進行並行程式開發。第三,詳細討論“鎖”的最佳化,以及提高並行程式性能級別的方法和思路。第四,介紹並行的基本設計模式,以及Java 8/9/10對並行程式的支持和改進。第五,介紹高並發框架Akka的使用方法。第六,詳細介紹並行程式的調試方法。第七,分析Jetty代碼並給出一些其在高並發最佳化方面的例子。
《實戰Java高並發程式設計(第3版)》內容豐富,實例典型,實用性強,適合有一定Java基礎的技術開發人員閱讀。

圖書目錄

第1章 走入並行世界 1
1.1 何去何從的並行計算 1
1.1.1 忘掉那該死的並行 2
1.1.2 可怕的現實:摩爾定律的失效 4
1.1.3 柳暗花明:不斷地前進 5
1.1.4 光明或是黑暗 6
1.2 你必須知道的幾個概念 7
1.2.1 同步(Synchronous)和異步(Asynchronous) 7
1.2.2 並發(Concurrency)和並行(Parallelism) 8
1.2.3 臨界區 9
1.2.4 阻塞(Blocking)和非阻塞(Non-Blocking) 9
1.2.5 死鎖(Deadlock)、飢餓(Starvation)和活鎖(Livelock) 10
1.3 並發級別 11
1.3.1 阻塞 11
1.3.2 無飢餓(Starvation-Free) 11
1.3.3 無障礙(Obstruction-Free) 12
1.3.4 無鎖(Lock-Free) 13
1.3.5 無等待(Wait-Free) 13
1.4 有關並行的兩個重要定律 14
1.4.1 Amdahl定律 14
1.4.2 Gustafson定律 16
1.4.3 是否相互矛盾 17
1.5 回到Java:JMM 18
1.5.1 原子性(Atomicity) 18
1.5.2 可見性(Visibility) 20
1.5.3 有序性(Ordering) 22
1.5.4 哪些指令不能重排:Happen-Before規則 27
第2章 Java並行程式基礎 29
2.1 有關執行緒你必須知道的事 29
2.2 初始執行緒:執行緒的基本操作 32
2.2.1 新建執行緒 32
2.2.2 終止執行緒 34
2.2.3 執行緒中斷 38
2.2.4 等待(wait)和通知(notify) 41
2.2.5 掛起(suspend)和繼續執行(resume)執行緒 45
2.2.6 等待執行緒結束(join)和謙讓(yield) 48
2.3 volatile與Java記憶體模型(JMM)50
2.4 分門別類的管理:執行緒組 53
2.5 駐守後台:守護執行緒(Daemon)54
2.6 先做重要的事:執行緒優先權 55
2.7 執行緒安全的概念與關鍵字synchronized57
2.8 程式中的幽靈:隱蔽的錯誤 61
2.8.1 無提示的錯誤案例 61
2.8.2 並發下的ArrayList62
2.8.3 並發下詭異的HashMap 64
2.8.4 初學者常見的問題:錯誤的加鎖 66
第3章 JDK並發包69
3.1 多執行緒的團隊協作:同步控制 69
3.1.1 超越synchronized的同步工具:重入鎖 70
3.1.2 重入鎖的好搭檔:Condition 79
3.1.3 允許多個執行緒同時訪問:信號量(Semaphore) 83
3.1.4 ReadWriteLock讀寫鎖 85
3.1.5 倒計數器:CountDownLatch 88
3.1.6 循環柵欄:CyclicBarrier 89
3.1.7 執行緒阻塞工具類:LockSupport 93
3.1.8 深入理解鎖:AbstractQueuedSynchronizer 96
3.1.9 Guava和RateLimiter限流 105
3.2 執行緒復用:執行緒池 108
3.2.1 什麼是執行緒池 109
3.2.2 不要重複發明輪子:JDK對執行緒池的支持110
3.2.3 刨根究底:核心執行緒池的內部實現 116
3.2.4 超負載了怎么辦:拒絕策略 120
3.2.5 自定義執行緒創建:ThreadFactory 122
3.2.6 我的套用我做主:擴展執行緒池 123
3.2.7 合理的選擇:最佳化執行緒池執行緒數量 126
3.2.8 堆疊去哪裡了:線上程池中尋找堆疊 127
3.2.9 分而治之:Fork/Join框架 131
3.2.10 Guava中對執行緒池的擴展 135
3.3 不要重複發明輪子:JDK的並發容器 137
3.3.1 超好用的工具類:並發集合簡介 137
3.3.2 執行緒安全的HashMap 138
3.3.3 深入淺出ConcurrentHashMap 139
3.3.4 有關List的執行緒安全 145
3.3.5 高效讀寫的佇列:深度剖析ConcurrentLinkedQueue類 145
3.3.6 高效讀取:不變模式下的CopyOnWriteArrayList類 151
3.3.7 數據共享通道:BlockingQueue 152
3.3.8 隨機數據結構:跳表(SkipList) 157
3.4 使用JMH進行性能測試 159
3.4.1 什麼是JMH 160
3.4.2 Hello JMH 160
3.4.3 JMH的基本概念和配置 163
3.4.4 理解JMH中的Mode 164
3.4.5 理解JMH中的State 166
3.4.6 有關性能的一些思考 166
3.4.7 CopyOnWriteArrayList類與ConcurrentLinkedQueue類 169
第4章 鎖的最佳化及注意事項 172
4.1 有助於提高鎖性能的幾點建議 173
4.1.1 減少鎖持有時間 173
4.1.2 減小鎖粒度 174
4.1.3 用讀寫分離鎖來替換獨占鎖 175
4.1.4 鎖分離 175
4.1.5 鎖粗化 178
4.2 Java虛擬機對鎖最佳化所做的努力 179
4.2.1 鎖偏向 179
4.2.2 輕量級鎖 180
4.2.3 自旋鎖 180
4.2.4 鎖消除 180
4.3 人手一支筆:ThreadLocal 181
4.3.1 ThreadLocal的簡單使用 181
4.3.2 ThreadLocal的實現原理 183
4.3.3 對性能有何幫助 189
4.3.4 執行緒私有的隨機數發生器ThreadLocalRandom 192
4.4 無鎖 197
4.4.1 與眾不同的並發策略:比較交換 197
4.4.2 無鎖的執行緒安全整數:AtomicInteger198
4.4.3 Java中的指針:Unsafe類 200
4.4.4 無鎖的對象引用:AtomicReference 202
4.4.5 帶有時間戳的對象引用:AtomicStampedReference 205
4.4.6 數組也能無鎖:AtomicIntegerArray 208
4.4.7 讓普通變數也享受原子操作:AtomicIntegerFieldUpdater 209
4.4.8 挑戰無鎖算法:無鎖的Vector實現 211
4.4.9 讓執行緒之間互相幫助:細看SynchronousQueue的實現 216
4.5 有關死鎖的問題 220
第5章 並行模式與算法 224
5.1 探討單例模式 224
5.2 不變模式 228
5.3 生產者-消費者模式 230
5.4 高性能的生產者-消費者模式:無鎖的實現 235
5.4.1 無鎖的快取框架:Disruptor235
5.4.2 用Disruptor框架實現生產者-消費者模式的案例 236
5.4.3 提高消費者的回響時間:選擇合適的策略 240
5.4.4 CPU Cache的最佳化:解決偽共享問題241
5.5 Future模式 244
5.5.1 Future模式的主要參與者 247
5.5.2 Future模式的簡單實現 247
5.5.3 JDK中的Future模式 250
5.5.4 Guava對Future模式的支持 252
5.6 並行流水線 254
5.7 並行搜尋 258
5.8 並行排序 260
5.8.1 分離數據相關性:奇偶交換排序 260
5.8.2 改進的插入排序:希爾排序 264
5.9 並行算法:矩陣乘法 268
5.10 準備好了再通知我:網路NIO 272
5.10.1 基於Socket的服務端多執行緒模式 273
5.10.2 使用NIO進行網路編程 278
5.10.3 使用NIO實現客戶端 286
5.11 讀完了再通知我:AIO 288
5.11.1 AIO EchoServer的實現 288
5.11.2 AIO客戶端的實現 291
第6章 Java 8/9/10與並發 294
6.1 Java 8的函式式編程簡介 294
6.1.1 函式作為一等公民 295
6.1.2 無副作用 296
6.1.3 聲明式的編程方式 296
6.1.4 不變的對象 297
6.1.5 易於並行 297
6.1.6 更少的代碼 297
6.2 函式式編程基礎 298
6.2.1 FunctionalInterface注釋 298
6.2.2 接口默認方法 299
6.2.3 lambda表達式 303
6.2.4 方法引用 304
6.3 一步一步走入函式式編程 306
6.4 並行流與並行排序 311
6.4.1 使用並行流過濾數據 311
6.4.2 從集合得到並行流 312
6.4.3 並行排序 312
6.5 增強的Future:CompletableFuture 313
6.5.1 完成了就通知我 313
6.5.2 異步執行任務 314
6.5.3 流式調用 316
6.5.4 CompletableFuture中的異常處理 316
6.5.5 組合多個CompletableFuture 317
6.5.6 支持timeout的CompletableFuture 319
6.6 讀寫鎖的改進:StampedLock319
6.6.1 StampedLock的使用示例 320
6.6.2 StampedLock的小陷阱321
6.6.3 有關StampedLock的實現思想 323
6.7 原子類的增強 326
6.7.1 更快的原子類:LongAdder 327
6.7.2 LongAdder功能的增強版:LongAccumulator 334
6.8 ConcurrentHashMap的增強 335
6.8.1 forEach操作 335
6.8.2 reduce操作 335
6.8.3 條件插入 336
6.8.4 search操作 337
6.8.5 其他新方法 338
6.9 發布訂閱模式 338
6.9.1 簡單的發布訂閱模式案例 340
6.9.2 數據處理鏈 342
第7章 使用Akka構建高並發程式 344
7.1 新並發模型:Actor 345
7.2 Akka之Hello World 345
7.3 有關訊息投遞的一些說明 348
7.4 Actor的生命周期 350
7.5 監督策略 354
7.6 選擇Actor359
7.7 訊息收件箱(Inbox) 359
7.8 訊息路由 361
7.9 Actor的內置狀態轉換 364
7.10 詢問模式:Actor中的Future 367
7.11 多個Actor同時修改數據:Agent 369
7.12 像資料庫一樣操作記憶體數據:軟體事務記憶體 372
7.13 一個有趣的例子:並發粒子群的實現376
7.13.1 什麼是粒子群算法 377
7.13.2 粒子群算法的計算過程 377
7.13.3 粒子群算法能做什麼 378
7.13.4 使用Akka實現粒子群算法 379
第8章 並行程式調試 388
8.1 準備實驗樣本 388
8.2 正式起航 389
8.3 掛起整個虛擬機 392
8.4 調試進入ArrayList內部 393
第9章 多執行緒最佳化示例——Jetty核心代碼分析 397
9.1 Jetty簡介與架構 397
9.2 Jetty伺服器初始化 399
9.2.1 初始化執行緒池 399
9.2.2 初始化ScheduledExecutorScheduler 401
9.2.3 初始化ByteBufferPool 402
9.2.4 維護ConnectionFactory 405
9.2.5 計算ServerConnector的執行緒數量 406
9.3 啟動Jetty伺服器 406
9.3.1 設定啟動狀態 406
9.3.2 註冊ShutdownMonitor 407
9.3.3 計算系統的執行緒數量 407
9.3.4 啟動QueuedThreadPool 408
9.3.5 啟動Connector 408
9.4 處理HTTP請求 411
9.4.1 Accept成功 411
9.4.2 請求處理 413

作者簡介

葛一鳴
軟體工程碩士,2006年獲得國家認證系統分析師證書,十餘年軟體架構、設計與研發經驗。
尤其精通Java軟體開發與設計,對Java虛擬機、設計模式、人工智慧和神經網路均有研究。
著有《Java程式性能最佳化》《實戰Java虛擬機》《自己動手寫神經網路》等技術圖書。

相關詞條

熱門詞條

聯絡我們