注冊 | 登錄讀書好,好讀書,讀好書!
讀書網(wǎng)-DuShu.com
當(dāng)前位置: 首頁出版圖書科學(xué)技術(shù)工業(yè)技術(shù)建筑科學(xué)建筑設(shè)計(jì)實(shí)戰(zhàn)Java高并發(fā)程序設(shè)計(jì)(第2版)

實(shí)戰(zhàn)Java高并發(fā)程序設(shè)計(jì)(第2版)

實(shí)戰(zhàn)Java高并發(fā)程序設(shè)計(jì)(第2版)

定 價(jià):¥89.00

作 者: 葛一鳴
出版社: 電子工業(yè)出版社
叢編項(xiàng):
標(biāo) 簽: 暫缺

ISBN: 9787121350030 出版時(shí)間: 2018-10-01 包裝: 平裝
開本: 16開 頁數(shù): 416 字?jǐn)?shù):  

內(nèi)容簡介

  在單核CPU時(shí)代,單任務(wù)在一個(gè)時(shí)間點(diǎn)只能執(zhí)行單一程序,隨著多核CPU的發(fā)展,并行程序開發(fā)變得尤為重要。本書主要介紹基于Java的并行程序設(shè)計(jì)基礎(chǔ)、思路、方法和實(shí)戰(zhàn)。**,立足于并發(fā)程序基礎(chǔ),詳細(xì)介紹Java進(jìn)行并行程序設(shè)計(jì)的基本方法。第二,進(jìn)一步詳細(xì)介紹了JDK對并行程序的強(qiáng)大支持,幫助讀者快速、穩(wěn)健地進(jìn)行并行程序開發(fā)。第三,詳細(xì)討論了“鎖”的優(yōu)化和提高并行程序性能級別的方法和思路。第四,介紹了并行的基本設(shè)計(jì)模式,以及Java 8/9/10對并行程序的支持和改進(jìn)。第五,介紹了高并發(fā)框架Akka的使用方法。第六,詳細(xì)介紹了并行程序的調(diào)試方法。第七,分析Jetty代碼并給出一些其在高并發(fā)優(yōu)化方面的例子。本書內(nèi)容豐富,實(shí)例典型,實(shí)用性強(qiáng),適合有一定Java基礎(chǔ)的技術(shù)開發(fā)人員閱讀。

作者簡介

  葛一鳴:51CTO特約講師,國家認(rèn)證系統(tǒng)分析師,獲得Oracle OCP認(rèn)證。長期從事Java軟件開發(fā)工作,對Java程序設(shè)計(jì)、JVM有深入的研究,對設(shè)計(jì)模式、人工智能、神經(jīng)網(wǎng)絡(luò)、數(shù)據(jù)挖掘等技術(shù)有濃厚興趣,著有《自己動(dòng)手寫神經(jīng)網(wǎng)路》電子書和《實(shí)戰(zhàn)Java虛擬機(jī)》一書。

圖書目錄

第1章 走入并行世界 1

1.1 何去何從的并行計(jì)算 1

1.1.1 忘掉那該死的并行 2

1.1.2 可怕的現(xiàn)實(shí):摩爾定律的失效 4

1.1.3 柳暗花明:不斷地前進(jìn) 5

1.1.4 光明或是黑暗 6

1.2 你必須知道的幾個(gè)概念 7

1.2.1 同步(Synchronous)和異步(Asynchronous) 7

1.2.2 并發(fā)(Concurrency)和并行(Parallelism) 8

1.2.3 臨界區(qū) 9

1.2.4 阻塞(Blocking)和非阻塞(Non-Blocking) 9

1.2.5 死鎖(Deadlock)、饑餓(Starvation)和活鎖(Livelock) 10

1.3 并發(fā)級別 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 有關(guān)并行的兩個(gè)重要定律 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規(guī)則 27

第2章 Java并行程序基礎(chǔ) 29

2.1 有關(guān)線程你必須知道的事 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)和繼續(xù)執(zhí)行(resume)線程 45

2.2.6 等待線程結(jié)束(join)和謙讓(yeild) 49

2.3 volatile與Java內(nèi)存模型(JMM) 50

2.4 分門別類的管理:線程組 53

2.5 駐守后臺(tái):守護(hù)線程(Daemon) 54

2.6 先做重要的事:線程優(yōu)先級 56

2.7 線程安全的概念與關(guān)鍵字synchronized 57

2.8 程序中的幽靈:隱蔽的錯(cuò)誤 61

2.8.1 無提示的錯(cuò)誤案例 62

2.8.2 并發(fā)下的ArrayList 63

2.8.3 并發(fā)下詭異的HashMap 64

2.8.4 初學(xué)者常見的問題:錯(cuò)誤的加鎖 67

第3章 JDK并發(fā)包 71

3.1 多線程的團(tuán)隊(duì)協(xié)作:同步控制 71

3.1.1 關(guān)鍵字synchronized的功能擴(kuò)展:重入鎖 72

3.1.2 重入鎖的好搭檔:Condition 81

3.1.3 允許多個(gè)線程同時(shí)訪問:信號量(Semaphore) 85

3.1.4 ReadWriteLock讀寫鎖 86

3.1.5 倒計(jì)數(shù)器:CountDownLatch 89

3.1.6 循環(huán)柵欄:CyclicBarrier 91

3.1.7 線程阻塞工具類:LockSupport 94

3.1.8 Guava和RateLimiter限流 98

3.2 線程復(fù)用:線程池 101

3.2.1 什么是線程池 102

3.2.2 不要重復(fù)發(fā)明輪子:JDK對線程池的支持 102

3.2.3 刨根究底:核心線程池的內(nèi)部實(shí)現(xiàn) 108

3.2.4 超負(fù)載了怎么辦:拒絕策略 112

3.2.5 自定義線程創(chuàng)建:ThreadFactory 115

3.2.6 我的應(yīng)用我做主:擴(kuò)展線程池 116

3.2.7 合理的選擇:優(yōu)化線程池線程數(shù)量 119

3.2.8 堆棧去哪里了:在線程池中尋找堆棧 120

3.2.9 分而治之:Fork/Join框架 124

3.2.10 Guava中對線程池的擴(kuò)展 128

3.3 不要重復(fù)發(fā)明輪子:JDK的并發(fā)容器 130

3.3.1 超好用的工具類:并發(fā)集合簡介 130

3.3.2 線程安全的HashMap 131

3.3.3 有關(guān)List的線程安全 132

3.3.4 高效讀寫的隊(duì)列:深度剖析ConcurrentLinkedQueue類 132

3.3.5 高效讀?。翰蛔兡J较碌腃opyOnWriteArrayList類 138

3.3.6 數(shù)據(jù)共享通道:BlockingQueue 139

3.3.7 隨機(jī)數(shù)據(jù)結(jié)構(gòu):跳表(SkipList) 144

3.4 使用JMH進(jìn)行性能測試 146

3.4.1 什么是JMH 147

3.4.2 Hello JMH 147

3.4.3 JMH的基本概念和配置 150

3.4.4 理解JMH中的Mode 151

3.4.5 理解JMH中的State 153

3.4.6 有關(guān)性能的一些思考 154

3.4.7 CopyOnWriteArrayList類與ConcurrentLinkedQueue類 157

第4章 鎖的優(yōu)化及注意事項(xiàng) 161

4.1 有助于提高鎖性能的幾點(diǎn)建議 162

4.1.1 減少鎖持有時(shí)間 162

4.1.2 減小鎖粒度 163

4.1.3 用讀寫分離鎖來替換獨(dú)占鎖 165

4.1.4 鎖分離 165

4.1.5 鎖粗化 168

4.2 Java虛擬機(jī)對鎖優(yōu)化所做的努力 169

4.2.1 鎖偏向 169

4.2.2 輕量級鎖 169

4.2.3 自旋鎖 170

4.2.4 鎖消除 170

4.3 人手一支筆:ThreadLocal 171

4.3.1 ThreadLocal的簡單使用 171

4.3.2 ThreadLocal的實(shí)現(xiàn)原理 173

4.3.3 對性能有何幫助 179

4.4 無鎖 182

4.4.1 與眾不同的并發(fā)策略:比較交換 182

4.4.2 無鎖的線程安全整數(shù):AtomicInteger 183

4.4.3 Java中的指針:Unsafe類 185

4.4.4 無鎖的對象引用:AtomicReference 187

4.4.5 帶有時(shí)間戳的對象引用:AtomicStampedReference 190

4.4.6 數(shù)組也能無鎖:AtomicIntegerArray 193

4.4.7 讓普通變量也享受原子操作:AtomicIntegerFieldUpdater 194

4.4.8 挑戰(zhàn)無鎖算法:無鎖的Vector實(shí)現(xiàn) 196

4.4.9 讓線程之間互相幫助:細(xì)看SynchronousQueue的實(shí)現(xiàn) 201

4.5 有關(guān)死鎖的問題 205

第5章 并行模式與算法 209

5.1 探討單例模式 209

5.2 不變模式 213

5.3 生產(chǎn)者-消費(fèi)者模式 215

5.4 高性能的生產(chǎn)者-消費(fèi)者模式:無鎖的實(shí)現(xiàn) 220

5.4.1 無鎖的緩存框架:Disruptor 221

5.4.2 用Disruptor框架實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者模式的案例 222

5.4.3 提高消費(fèi)者的響應(yīng)時(shí)間:選擇合適的策略 225

5.4.4 CPU Cache的優(yōu)化:解決偽共享問題 226

5.5 Future模式 230

5.5.1 Future模式的主要角色 232

5.5.2 Future模式的簡單實(shí)現(xiàn) 233

5.5.3 JDK中的Future模式 236

5.5.4 Guava對Future模式的支持 238

5.6 并行流水線 240

5.7 并行搜索 244

5.8 并行排序 246

5.8.1 分離數(shù)據(jù)相關(guān)性:奇偶交換排序 246

5.8.2 改進(jìn)的插入排序:希爾排序 250

5.9 并行算法:矩陣乘法 254

5.10 準(zhǔn)備好了再通知我:網(wǎng)絡(luò)NIO 258

5.10.1 基于Socket的服務(wù)端多線程模式 259

5.10.2 使用NIO進(jìn)行網(wǎng)絡(luò)編程 264

5.10.3 使用NIO來實(shí)現(xiàn)客戶端 272

5.11 讀完了再通知我:AIO 274

5.11.1 AIO EchoServer的實(shí)現(xiàn) 275

5.11.2 AIO Echo客戶端的實(shí)現(xiàn) 277

第6章 Java 8/9/10與并發(fā) 281

6.1 Java 8的函數(shù)式編程簡介 281

6.1.1 函數(shù)作為一等公民 282

6.1.2 無副作用 283

6.1.3 聲明式的(Declarative) 283

6.1.4 不變的對象 284

6.1.5 易于并行 284

6.1.6 更少的代碼 284

6.2 函數(shù)式編程基礎(chǔ) 285

6.2.1 FunctionalInterface注釋 285

6.2.2 接口默認(rèn)方法 286

6.2.3 lambda表達(dá)式 290

6.2.4 方法引用 291

6.3 一步一步走入函數(shù)式編程 293

6.4 并行流與并行排序 298

6.4.1 使用并行流過濾數(shù)據(jù) 298

6.4.2 從集合得到并行流 299

6.4.3 并行排序 299

6.5 增強(qiáng)的Future:CompletableFuture 300

6.5.1 完成了就通知我 300

6.5.2 異步執(zhí)行任務(wù) 301

6.5.3 流式調(diào)用 303

6.5.4 CompletableFuture中的異常處理 303

6.5.5 組合多個(gè)CompletableFuture 304

6.5.6 支持timeout的 CompletableFuture 306

6.6 讀寫鎖的改進(jìn):StampedLock 306

6.6.1 StampedLock使用示例 307

6.6.2 StampedLock的小陷阱 308

6.6.3 有關(guān)StampedLock的實(shí)現(xiàn)思想 310

6.7 原子類的增強(qiáng) 313

6.7.1 更快的原子類:LongAdder 314

6.7.2 LongAdder功能的增強(qiáng)版:LongAccumulator 320

6.8 ConcurrentHashMap的增強(qiáng) 321

6.8.1 foreach操作 321

6.8.2 reduce操作 321

6.8.3 條件插入 322

6.8.4 search操作 323

6.8.5 其他新方法 324

6.9 發(fā)布和訂閱模式 324

6.9.1 簡單的發(fā)布訂閱例子 326

6.9.2 數(shù)據(jù)處理鏈 328

第7章 使用Akka構(gòu)建高并發(fā)程序 331

7.1 新并發(fā)模型:Actor 332

7.2 Akka之Hello World 332

7.3 有關(guān)消息投遞的一些說明 336

7.4 Actor的生命周期 337

7.5 監(jiān)督策略 341

7.6 選擇Actor 346

7.7 消息收件箱(Inbox) 346

7.8 消息路由 348

7.9 Actor的內(nèi)置狀態(tài)轉(zhuǎn)換 351

7.10 詢問模式:Actor中的Future 354

7.11 多個(gè)Actor同時(shí)修改數(shù)據(jù):Agent 356

7.12 像數(shù)據(jù)庫一樣操作內(nèi)存數(shù)據(jù):軟件事務(wù)內(nèi)存 359

7.13 一個(gè)有趣的例子:并發(fā)粒子群的實(shí)現(xiàn) 363

7.13.1 什么是粒子群算法 364

7.13.2 粒子群算法的計(jì)算過程 364

7.13.3 粒子群算法能做什么 366

7.13.4 使用Akka實(shí)現(xiàn)粒子群 367

第8章 并行程序調(diào)試 375

8.1 準(zhǔn)備實(shí)驗(yàn)樣本 375

8.2 正式起航 376

8.3 掛起整個(gè)虛擬機(jī) 379

8.4 調(diào)試進(jìn)入ArrayList內(nèi)部 380

第9章 多線程優(yōu)化示例―Jetty核心代碼分析 385

9.1 Jetty簡介與架構(gòu) 385

9.2 Jetty服務(wù)器初始化 387

9.2.1 初始化線程池 387

9.2.2 初始化ScheduledExecutorScheduler 389

9.2.3 初始化ByteBufferPool 390

9.2.4 維護(hù)ConnectionFactory 393

9.2.5 計(jì)算ServerConnector的線程數(shù)量 394

9.3 啟動(dòng)Jetty服務(wù)器 394

9.3.1 設(shè)置啟動(dòng)狀態(tài) 394

9.3.2 注冊ShutdownMonitor 395

9.3.3 計(jì)算系統(tǒng)的線程數(shù)量 395

9.3.4 啟動(dòng)QueuedThreadPool 396

9.3.5 啟動(dòng)Connector 396

9.4 處理HTTP請求 399

9.4.1 Accept成功 399

9.4.2 請求處理 401

本目錄推薦

掃描二維碼
Copyright ? 讀書網(wǎng) m.ranfinancial.com 2005-2020, All Rights Reserved.
鄂ICP備15019699號 鄂公網(wǎng)安備 42010302001612號