關(guān)于我們
書單推薦
新書推薦
|
Java并發(fā)編程的藝術(shù) 讀者對象:JAVA語言程序設(shè)計人員
本書從并發(fā)編程的底層實現(xiàn)機制入手,圍繞JDK源碼、JVM、CPU等多角度詳細(xì)介紹了設(shè)計Java并發(fā)程序的框架、原理、核心技術(shù)、設(shè)計模式與應(yīng)用,同時輔以豐富的示例代碼,使得開發(fā)人員能夠更快地領(lǐng)悟Java并發(fā)編程的要領(lǐng),利用Java平臺的基礎(chǔ)并發(fā)功能快速地構(gòu)建大規(guī)模的并發(fā)應(yīng)用。
適讀人群 :*Java開發(fā)工程師、架構(gòu)師、并發(fā)編程愛好者、開設(shè)相關(guān)課程的大專院校師生
(1)公認(rèn)標(biāo)準(zhǔn)著作:第1版在廣大讀者和Java專家群體中均獲得了超高口碑,是Java并發(fā)編程領(lǐng)域公認(rèn)的標(biāo)準(zhǔn)性著作。
【第2版迎來重大更新:】 為了反映Java并發(fā)編程領(lǐng)域的最新變化,為了解決Java并發(fā)編程領(lǐng)域的最新難題,本書第2版修訂和新增的內(nèi)容超過50%。 (1)第4章更新并增加“JDK9內(nèi)存順序模型”; (2)第5章更新并增加“StampedLock”“LockSupport 工具”“Condition 接口”; (3)第6章更新并增加“JDK 8 中的 ConcurrentHashMap”; (4)第7章更新并增加“ JDK 8 中的原子更新新特性”; (5)第10章更新并增加“JDK 8 的FutureTask 實現(xiàn)”; (6)新增第12章“分布式編程基礎(chǔ)”; (7)新增第13章“分布式鎖”; (8)新增第14章“分布式系統(tǒng)架構(gòu)”。
【為什么要寫這本書】
【第2版與第1版的區(qū)別】
【本書特色】
【讀者對象】
【如何閱讀本書】
本書共14章,由三位作者共同完成。其中第1章、第5章和第13章由魏鵬編寫,第4章和第10章由程曉明編寫,第12章由三位作者共同編寫,第14章由程曉明和方騰飛編寫,其余7章由方騰飛編寫。
方騰飛(花名:清英;英文名:kiral)
*魏鵬
*程曉明 前 言 第1章 Java并發(fā)編程基礎(chǔ) 1 1.1 線程簡介 1 1.1.1 什么是線程 1 1.1.2 為什么要使用多線程 2 1.1.3 線程優(yōu)先級 3 1.1.4 線程的狀態(tài) 4 1.1.5 Daemon線程 8 1.2 啟動和終止線程 8 1.2.1 構(gòu)造線程 9 1.2.2 啟動線程 9 1.2.3 理解中斷 9 1.2.4 過期的suspend()、resume()和 stop() 11 1.2.5 安全地終止線程 12 1.3 線程間通信 13 1.3.1 volatile和synchronized關(guān)鍵字 13 1.3.2 等待/通知機制 15 1.3.3 等待/通知的經(jīng)典范式 18 1.3.4 管道輸入/輸出流 19 1.3.5 thread.join()的使用 20 1.3.6 ThreadLocal的使用 22 1.4 線程應(yīng)用實例 23 1.4.1 等待超時模式 23 1.4.2 一個簡單的數(shù)據(jù)庫連接池示例 23 1.4.3 線程池技術(shù)及其示例 27 1.4.4 一個基于線程池技術(shù)的簡單 Web服務(wù)器 30 1.5 本章小結(jié) 34 第2章 并發(fā)編程的挑戰(zhàn) 35 2.1 上下文切換 35 2.1.1 多線程一定快嗎 35 2.1.2 測試上下文切換次數(shù)和時長 37 2.1.3 如何減少上下文切換 37 2.1.4 減少上下文切換實戰(zhàn) 38 2.2 死鎖 39 2.3 資源限制的挑戰(zhàn) 40 2.4 本章小結(jié) 41 第3章 Java并發(fā)機制的底層實現(xiàn) 原理 42 3.1 volatile的應(yīng)用 42 3.2 synchronized的實現(xiàn)原理與應(yīng)用 45 3.2.1 Java對象頭 46 3.2.2 鎖的升級與對比 47 3.3 原子操作的實現(xiàn)原理 50 3.4 本章小結(jié) 54 第4章 Java內(nèi)存模型 55 4.1 Java內(nèi)存模型基礎(chǔ) 55 4.1.1 并發(fā)編程模型的兩個關(guān)鍵 問題 55 4.1.2 Java內(nèi)存模型的抽象結(jié)構(gòu) 56 4.1.3 從源代碼到指令序列的重 排序 57 4.1.4 并發(fā)編程模型的分類 58 4.1.5 happens-before簡介 60 4.2 重排序 61 4.2.1 數(shù)據(jù)依賴性 62 4.2.2 as-if-serial語義 62 4.2.3 程序順序規(guī)則 63 4.2.4 重排序?qū)Χ嗑程的影響 63 4.3 順序一致性 65 4.3.1 數(shù)據(jù)競爭與順序一致性 65 4.3.2 順序一致性內(nèi)存模型 66 4.3.3 同步程序的順序一致性效果 68 4.3.4 未同步程序的執(zhí)行特性 69 4.4 volatile的內(nèi)存語義 71 4.4.1 volatile的特性 72 4.4.2 volatile寫-讀建立的 happens-before關(guān)系 73 4.4.3 volatile寫-讀的內(nèi)存語義 74 4.4.4 volatile內(nèi)存語義的實現(xiàn) 76 4.4.5 JSR-133為什么要增強volatile的 內(nèi)存語義 80 4.5 鎖的內(nèi)存語義 81 4.5.1 鎖的釋放-獲取建立的 happens-before關(guān)系 81 4.5.2 鎖的釋放和獲取的內(nèi)存語義 81 4.5.3 鎖內(nèi)存語義的實現(xiàn) 83 4.5.4 concurrent包的實現(xiàn) 87 4.6 f?inal域的內(nèi)存語義 89 4.6.1 f?inal域的重排序規(guī)則 89 4.6.2 寫f?inal域的重排序規(guī)則 89 4.6.3 讀f?inal域的重排序規(guī)則 90 4.6.4 f?inal域為引用類型 92 4.6.5 為什么f?inal引用不能在構(gòu)造 函數(shù)中“逸出” 93 4.6.6 f?inal語義在處理器中的實現(xiàn) 94 4.6.7 JSR-133為什么要增強f?inal的 語義 95 4.7 happens-before 95 4.7.1 JMM的設(shè)計 95 4.7.2 happens-before的定義 97 4.7.3 happens-before規(guī)則 98 4.8 雙重檢查鎖定與延遲初始化 100 4.8.1 雙重檢查鎖定的由來 100 4.8.2 問題的根源 102 4.8.3 基于volatile的解決方案 104 4.8.4 基于類初始化的解決方案 105 4.9 Java內(nèi)存模型綜述 111 4.9.1 處理器的內(nèi)存模型 111 4.9.2 各種內(nèi)存模型之間的關(guān)系 112 4.9.3 JMM的內(nèi)存可見性保證 114 4.9.4 JSR-133對舊內(nèi)存模型的修補 115 4.10 JDK 9內(nèi)存順序模型 115 4.10.1 背景 115 4.10.2 Plain 116 4.10.3 Opaque 116 4.10.4 Release/Acquire 117 4.10.5 volatile 118 4.10.6 總結(jié) 118 4.11 本章小結(jié) 119 第5章 Java中的鎖 120 5.1 Lock接口 120 5.2 隊列同步器 122 5.2.1 隊列同步器的接口與示例 122 5.2.2 隊列同步器的實現(xiàn)分析 125 5.3 重入鎖 136 5.4 讀寫鎖 141 5.4.1 讀寫鎖的接口與示例 141 5.4.2 讀寫鎖的實現(xiàn)分析 143 5.5 StampedLock 146 5.5.1 StampedLock的接口與示例 147 5.5.2 StampedLock的實現(xiàn)分析 152 5.6 LockSupport工具 160 5.7 Condition接口 161 5.7.1 Condition的接口與示例 162 5.7.2 Condition的實現(xiàn)分析 164 5.8 本章小結(jié) 168 第6章 Java并發(fā)容器和框架 169 6.1 ConcurrentHashMap的實現(xiàn) 原理與使用 169 6.1.1 為什么要使用 ConcurrentHashMap 169 6.1.2 ConcurrentHashMap的結(jié)構(gòu) 170 6.1.3 ConcurrentHashMap的 初始化 171 6.1.4 定位Segment 173 6.1.5 ConcurrentHashMap的操作 174 6.1.6 JDK 8中的 ConcurrentHashMap 175 6.2 ConcurrentLinkedQueue 175 6.2.1 ConcurrentLinkedQueue的 結(jié)構(gòu) 176 6.2.2 入隊列 176 6.2.3 出隊列 179 6.3 Java中的阻塞隊列 181 6.3.1 什么是阻塞隊列 181 6.3.2 7個阻塞隊列 182 6.3.3 阻塞隊列的實現(xiàn)原理 186 6.4 Fork/Join框架 189 6.4.1 什么是Fork/Join框架 189 6.4.2 工作竊取算法 190 6.4.3 Fork/Join框架的設(shè)計 190 6.4.4 使用Fork/Join框架 191 6.4.5 Fork/Join框架的異常處理 192 6.4.6 Fork/Join框架的實現(xiàn)原理 193 6.5 本章小結(jié) 194 第7章 Java中的13個原子操作類 195 7.1 原子更新基本類型 195 7.2 原子更新數(shù)組類型 197 7.3 原子更新引用類型 198 7.4 原子更新字段類型 199 7.5 JDK 8中的原子更新新特性 200 7.6 本章小結(jié) 201 第8章 Java中的并發(fā)工具類 202 8.1 等待多線程完成的 CountDownLatch 202 8.2 同步屏障CyclicBarrier 204 8.2.1 CyclicBarrier簡介 204 8.2.2 CyclicBarrier的應(yīng)用場景 206 8.2.3 CyclicBarrier和 CountDownLatch的區(qū)別 208 8.3 控制并發(fā)線程數(shù)的Semaphore 209 8.4 線程間交換數(shù)據(jù)的Exchanger 210 8.5 本章小結(jié) 211 第9章 Java中的線程池 212 9.1 線程池的實現(xiàn)原理 212 9.2 線程池的使用 215 9.2.1 線程池的創(chuàng)建 215 9.2.2 向線程池提交任務(wù) 216 9.2.3 關(guān)閉線程池 217 9.2.4 合理地配置線程池 217 9.2.5 線程池的監(jiān)控 218 9.3 本章小結(jié) 219 第10章 Executor框架 220 10.1 Executor框架簡介 220 10.1.1 Executor框架的兩級調(diào)度 模型 220 10.1.2 Executor框架的結(jié)構(gòu)與成員 220 10.2 ThreadPoolExecutor詳解 225 10.2.1 FixedThreadPool詳解 225 10.2.2 SingleThreadExecutor 詳解 226 10.2.3 CachedThreadPool詳解 227 10.3 ScheduledThreadPoolExecutor ?詳解 229 10.3.1 ScheduledThreadPoolExecutor的 運行機制 229 10.3.2 ScheduledThreadPoolExecutor的 實現(xiàn) 230 10.4 FutureTask詳解 233 10.4.1 FutureTask簡介 233 10.4.2 FutureTask的使用 235 10.4.3 JDK 6的FutureTask實現(xiàn) 236 10.4.4 JDK 8的FutureTask實現(xiàn) 238 10.5 本章小結(jié) 243 第11章 Java并發(fā)編程實踐 244 11.1 生產(chǎn)者和消費者模式 244 11.1.1 生產(chǎn)者和消費者模式實戰(zhàn) 245 11.1.2 多生產(chǎn)者和多消費者場景 247 11.1.3 線程池與生產(chǎn)者和消費者 模式 250 11.2 線上問題定位 250 11.3 性能測試 252 11.4 異步任務(wù)池 254 11.5 本章小結(jié) 256 第12章 分布式編程基礎(chǔ) 257 12.1 分布式CAP原則 257 12.1.1 CAP原則簡介 257 12.1.2 CAP原則證明 258 12.1.3 CAP原則思考 260 12.2 分布式事務(wù):兩階段提交 262 12.2.1 分布式事務(wù)面臨的挑戰(zhàn) 262 12.2.2 拜占庭將軍問題 263 12.2.3 兩階段提交協(xié)議 264 12.2.4 對兩階段提交的思考 265 12.3 分布式事務(wù):TCC 266 12.3.1 TCC的主要優(yōu)勢 267 12.3.2 TCC的使用代價 269 12.3.3 支持TCC的Seata 270 12.3.4 一個基于Seata的參考 示例 273 12.4 分布式協(xié)議:RAFT 279 12.4.1 RAFT的運行流程 279 12.4.2 集群中斷和恢復(fù) 280 12.5 分布式協(xié)議:Paxos 282 12.5.1 背景 282 12.5.2 Basic Paxos 285 12.5.3 Multi-Paxos 301 12.6 本章小結(jié) 306 第13章 分布式鎖 308 13.1 什么是分布式鎖 308 13.1.1 分布式鎖的定義 308 13.1.2 使用分布式鎖的原因 309 13.1.3 分布式鎖的分類 309 13.2 實現(xiàn)分布式鎖會遇到的問題 310 13.2.1 性能問題 311 13.2.2 正確性問題 313 13.2.3 可用性問題 313 13.2.4 成本問題 315 13.3 分布式鎖框架 316 13.3.1 為什么需要分布式鎖框架 317 13.3.2 分布式鎖框架的組成 317 13.3.3 實現(xiàn):基于Redis的 分布式鎖 321 13.3.4 擴展:分布式鎖訪問日志 325 13.4 拉模式的分布式鎖 327 13.4.1 什么是拉模式 327 13.4.2 拉模式需要注意的問題 329 13.4.3 Redis分布式鎖實現(xiàn) 330 13.4.4 Redis分布式鎖存在的 問題 333 13.4.5 擴展:本地?zé)狳c鎖 337 13.5 推模式的分布式鎖 340 13.5.1 什么是推模式 341 13.5.2 ZooKeeper如何實現(xiàn)推模式的 分布式鎖 343 13.5.3 Curator分布式鎖 349 13.5.4 ZooKeeper分布式鎖實現(xiàn) 351 13.5.5 ZooKeeper分布式鎖存在的 問題 351 13.6 再看分布式鎖 353 13.6.1 比選擇推與拉更重要的 是什么 353 13.6.2 解鎖勝于用鎖 355 13.7 本章小結(jié) 357 第14章 分布式系統(tǒng)架構(gòu) 358 14.1 分布式場景下的限流架構(gòu)方案 358 14.1.1 限流算法 358 14.1.2 基于Redis的分布式限流 360 14.1.3 基于Sentinel的分布式 限流 365 14.2 分布式場景下的秒殺架構(gòu) 方案 366 14.2.1 背景 366 14.2.2 需求分析 366 14.2.3 用例分析 367 14.2.4 秒殺流程圖 367 14.2.5 關(guān)鍵設(shè)計:庫存設(shè)計 368 14.2.6 關(guān)鍵設(shè)計:秒殺令牌 369 14.3 分布式場景下的高并發(fā)架構(gòu) 方案 369 14.3.1 應(yīng)對高并發(fā)的常用策略 369 14.3.2 減少強依賴 370 14.3.3 多層故障隔離 371 14.3.4 五種架構(gòu)選型 372 14.3.5 三種緩存設(shè)計方案 372 14.4 分布式場景下的資損防控 372 14.4.1 資損的定義 372 14.4.2 如何進行資損防控 373 14.4.3 第一道防線:事前規(guī)避 373 14.4.4 第二道防線:事中定位 374 14.4.5 第三道防線:事后應(yīng)急 375 14.4.6 如何進行資損演練 376 14.5 分布式場景下的穩(wěn)定性保障 376 14.5.1 什么是穩(wěn)定性保障 376 14.5.2 明確穩(wěn)定性保障目標(biāo) 376 14.5.3 如何進行穩(wěn)定性保障 377 14.5.4 大促穩(wěn)定性保障 380 14.6 本章小結(jié) 382
你還可能感興趣
我要評論
|