预购商品
书目分类
特别推荐
\好評再版// ☆先了解作業系統中的執行緒排程架構 ☆多核心CPU上設計Java平行程式 ☆併發式程式的設計理念,分工、同步、互斥 ☆核心原理說明,原子性、可見性、有序性 Synchronized、AQS、CAS、鎖、執行緒池、ThreadLocal的核心原理 ☆手動開發執行緒池實戰案例 ☆使用CAS開發自旋鎖實戰案例 ☆使用讀/寫鎖實戰快取 ☆使用AQS實現可重入鎖 ☆開發分散式鎖架構 ☆完整大型實戰一個秒殺系統的完整架構 高併發是高流量、高資料量服務線上系統架構必須具備的特性,如果想從微觀核心到併發應用,再到業務架構學習高併發的核心原理,以及高併發系統的工程架構最佳實踐,本書是中文書籍中最佳的範本,在細節部分,對核心排程、同步非同步、各類鎖的實現細節都有詳盡的敘述,另外在在併發應用層面,對CAS問題、ABA問題、連接池實現,也有很完整的案例講解。在更高的架構層面上,對快取併發實戰、電子商務超賣問題、秒殺系統架構,更有清楚且應用上的說明,讓讀者能從CPU、作業系統、JVM底層原理為基礎,站在實踐的角度上全面了解高併發的基本原理及實用。在電腦多核心時代,併發程式設計是每個程式設計師都應掌握的技能,伺服器上的CPU核心在EPYC出後,成千上百個處理器同時為你工作,如果你寫出來的程式還無法執行多處理程序,多執行緒,多核心,小心真的成為時代的眼淚!
第1篇 基礎知識 01 作業系統執行緒排程 ▌1.1 馮· 諾依曼系統結構 1.1.1 概述 1.1.2 電腦五大組成部分 ▌1.2 CPU 架構 1.2.1 CPU 的組成部分 1.2.2 CPU 邏輯結構 1.2.3 單核心CPU 的不足 1.2.4 多核心CPU 架構 1.2.5 多CPU 架構 ▌1.3 作業系統執行緒 1.3.1 使用者級執行緒 1.3.2 核心級執行緒 1.3.3 混合級執行緒 ▌1.4 Java 執行緒與作業系統執行緒的關係 ▌1.5 本章複習 02 並行程式設計概述 ▌2.1 並行程式設計的基本概念 2.1.1 程式 2.1.2 處理程序與執行緒 2.1.3 執行緒組 2.1.4 使用者執行緒與守護執行緒 2.1.5 並行與並行 2.1.6 同步與非同步 2.1.7 共享與獨享 2.1.8 臨界區 2.1.9 阻塞與非阻塞 ▌2.2 並行程式設計的風險 2.2.1 安全性問題 2.2.2 活躍性問題 2.2.3 性能問題 ▌2.3 並行程式設計中的鎖 2.3.1 悲觀鎖與樂觀鎖 2.3.2 公平鎖與非公平鎖 2.3.3 獨佔鎖與共享鎖 2.3.4 可重入鎖與不可重入鎖 2.3.5 可中斷鎖與不可中斷鎖 2.3.6 讀/ 寫鎖 2.3.7 自旋鎖 2.3.8 鎖死、饑餓與活鎖 ▌2.4 本章複習 第2篇 核心原理 03 並行程式設計的三大核心問題 ▌3.1 分工問題 3.1.1 模擬現實案例 3.1.2 並行程式設計中的分工 ▌3.2 同步問題 3.2.1 模擬現實案例 3.2.2 並行程式設計中的同步 ▌3.3 互斥問題 3.3.1 模擬現實案例 3.3.2 並行程式設計中的互斥 ▌3.4 本章複習 04 並行程式設計的本質問題 ▌4.1 電腦的核心矛盾 4.1.1 核心矛盾概述 4.1.2 CPU 如何解決核心矛盾 4.1.3 作業系統如何解決核心矛盾 4.1.4 編譯器如何解決核心矛盾 4.1.5 引發的問題 ▌4.2 原子性 4.2.1 原子性概述 4.2.2 原子性問題 4.2.3 Java 中的原子性問題 4.2.4 原子性問題複習 ▌4.3 可見性 4.3.1 可見性概述 4.3.2 可見性問題 4.3.3 Java 中的可見性問題 4.3.4 可見性問題複習 ▌4.4 有序性 4.4.1 有序性概述 4.4.2 有序性問題 4.4.3 Java 中的有序性問題 4.4.4 有序性問題複習 ▌4.5 解決方案 4.5.1 原子性問題解決方案 4.5.2 可見性與有序性問題解決方案 ▌4.6 本章複習 05 原子性的核心原理 ▌5.1 原子性原理 ▌5.2 處理器保證原子性 5.2.1 CPU 保證基本記憶體操作的原子性 5.2.2 匯流排鎖保證原子性 5.2.3 快取鎖保證原子性 ▌5.3 互斥鎖保證原子性 5.3.1 互斥鎖模型 5.3.2 最佳化後的互斥鎖模型 ▌5.4 CAS 保證原子性 ▌5.5 本章複習 06 可見性與有序性核心原理 ▌6.1 CPU 多級快取架構 6.1.1 CPU 為何使用多級快取架構 6.1.2 CPU 多級快取架構原理 6.1.3 CPU 的計算流程 ▌6.2 快取一致性 6.2.1 什麼是快取一致性 6.2.2 快取一致性協定 6.2.3 MESI 協定快取狀態 6.2.4 MESI 協定的狀態轉換 6.2.5 MESI 協定帶來的問題 ▌6.3 錯誤分享 6.3.1 錯誤分享的概念 6.3.2 錯誤分享產生的場景 6.3.3 如何解決錯誤分享問題 ▌6.4 volatile 核心原理 6.4.1 保證可見性核心原理 6.4.2 保證有序性核心原理 6.4.3 volatile 的局限性 ▌6.5 記憶體屏障 6.5.1 編譯器重排序 6.5.2 CPU 重排序 6.5.3 as-if-serial 原則 6.5.4 電腦硬體實現的記憶體屏障 ▌6.6 Java 記憶體模型 6.6.1 Java 記憶體模型的概念 6.6.2 Java 記憶體模型的八大操作 6.6.3 Java 記憶體模型解決可見性與有序性問題 ▌6.7 Happens-Before 原則 6.7.1 Happens-Before 原則概述 6.7.2 程式次序原則 6.7.3 volatile 變數原則 6.7.4 傳遞原則 6.7.5 鎖定原則 6.7.6 執行緒啟動原則 6.7.7 執行緒終結原則 6.7.8 執行緒中斷原則 6.7.9 物件終結原則 ▌6.8 本章複習 07 synchronized 核心原理 ▌7.1 synchronized 用法 7.1.1 同步實例方法 7.1.2 同步靜態方法 7.1.3 同步程式區塊 ▌7.2 Java 物件結構 7.2.1 物件結構總覽 7.2.2 物件標頭 7.2.3 實例資料 7.2.4 對齊填充 ▌7.3 Java 物件標頭 7.3.1 Mark Word 7.3.2 類型指標 7.3.3 陣列長度 ▌7.4 使用JOL 查看物件資訊 7.4.1 引入JOL 環境依賴 7.4.2 列印物件資訊 7.4.3 列印物件鎖狀態 ▌7.5 synchronized 核心原理 7.5.1 synchronized 底層原理 7.5.2 Monitor 鎖原理 7.5.3 反編譯synchronized方法 7.5.4 反編譯synchronized程式區塊 ▌7.6 偏向鎖 7.6.1 偏向鎖核心原理 7.6.2 偏向鎖的撤銷 7.6.3 偏向鎖案例 ▌7.7 輕量級鎖 7.7.1 輕量級鎖核心原理 7.7.2 輕量級鎖案例 ▌7.8 重量級鎖 7.8.1 重量級鎖核心原理 7.8.2 重量級鎖案例 ▌7.9 鎖升級的過程 ▌7.10 鎖消除 ▌7.11 本章複習 08 AQS 核心原理 ▌8.1 AQS 核心資料結構 8.1.1 AQS 資料結構原理 8.1.2 AQS 內部佇列模式 ▌8.2 AQS 底層鎖的支援 8.2.1 核心狀態位元 8.2.2 核心節點類別 8.2.3 獨佔鎖模式 8.2.4 共享鎖模式 ▌8.3 本章複習 09 Lock 鎖核心原理 ▌9.1 顯示鎖 ▌9.2 公平鎖與非公平鎖 9.2.1 公平鎖原理 9.2.2 ReentrantLock 中的公平鎖 9.2.3 公平鎖實戰 9.2.4 非公平鎖原理 9.2.5 ReentrantLock 中的非公平鎖 9.2.6 非公平鎖實戰 ▌9.3 悲觀鎖與樂觀鎖 9.3.1 悲觀鎖原理 9.3.2 悲觀鎖實戰 9.3.3 樂觀鎖原理 9.3.4 樂觀鎖實戰 ▌9.4 可中斷鎖與不可中斷鎖 9.4.1 可中斷鎖原理 9.4.2 可中斷鎖實戰 9.4.3 不可中斷鎖原理 9.4.4 不可中斷鎖實戰 ▌9.5 排他鎖與共享鎖 9.5.1 排他鎖原理 9.5.2 排他鎖實戰 9.5.3 共享鎖原理 9.5.4 共享鎖實戰 ▌9.6 可重入鎖 9.6.1 可重入鎖原理 9.6.2 可重入鎖實戰 ▌9.7 讀/ 寫鎖 9.7.1 讀/ 寫鎖原理 9.7.2 ReadWriteLock 讀/寫鎖 9.7.3 ReadWriteLock 鎖降級 9.7.4 StampedLock 讀/寫鎖 9.7.5 StampedLock 鎖的升級與降級 9.7.6 讀/ 寫鎖實戰 ▌9.8 LockSupport 9.8.1 LockSupport 原理 9.8.2 LockSupport 實戰 ▌9.9 本章複習 10 CAS 核心原理 ▌10.1 CAS 的基本概念 ▌10.2 CAS 的核心類別Unsafe 10.2.1 Unsafe 類別的核心方法 10.2.2 Unsafe 類別實戰 ▌10.3 使用CAS 實現count++ 10.3.1 案例分析 10.3.2 程式實現 10.3.3 測試程式 ▌10.4 ABA 問題 10.4.1 ABA 問題概述 10.4.2 ABA 問題解決方案 10.4.3 Java 如何解決ABA問題 ▌10.5 本章複習 11 鎖死的核心原理 ▌11.1 鎖死的基本概念 ▌11.2 鎖死的分析 11.2.1 執行緒不安全 11.2.2 串列執行 11.2.3 發生鎖死 ▌11.3 形成鎖死的必要條件 ▌11.4 鎖死的預防 ▌11.5 本章複習 12 鎖最佳化 ▌12.1 縮小鎖的範圍 ▌12.2 減小鎖的細微性 ▌12.3 鎖分離 ▌12.4 鎖分段 ▌12.5 鎖粗化 ▌12.6 避免熱點區域問題 ▌12.7 獨佔鎖的替換方案 ▌12.8 其他最佳化方案 ▌12.9 本章複習 13 執行緒池核心原理 ▌13.1 執行緒池的核心狀態 13.1.1 核心狀態說明 13.1.2 核心狀態的流轉過程 ▌13.2 執行緒池的建立方式 13.2.1 透過Executors 類別建立執行緒池 13.2.2 透過ThreadPoolExecutor類別建立執行緒池 13.2.3 透過ForkJoinPool類別建立執行緒池 13.2.4 透過ScheduledThreadPoolExecutor 類別建立執行緒池 ▌13.3 執行緒池執行任務的核心流程 13.3.1 執行任務的流程 13.3.2 拒絕策略 ▌13.4 執行緒池的關閉方式 13.4.1 shutdown() 方法 13.4.2 shutdownNow() 方法 ▌13.5 如何確定最佳執行緒數 13.5.1 CPU 密集型程式 13.5.2 I/O 密集型程式 ▌13.6 本章複習 14 ThreadLocal 核心原理 ▌14.1 ThreadLocal 的基本概念 ▌14.2 ThreadLocal 的使用案例 ▌14.3 ThreadLocal 的核心原理 14.3.1 Thread 類別原始程式 14.3.2 set() 方法 14.3.3 get() 方法 14.3.4 remove() 方法 ▌14.4 ThreadLocal 變數的不繼承性 ▌14.5 InheritableThreadLocal 的使用案例 ▌14.6 InheritableThreadLocal 的核心原理 ▌14.7 本章複習 第3篇 實戰案例 15 手動開發執行緒池實戰 ▌15.1 案例概述 ▌15.2 專案架設 ▌15.3 核心類別實現 15.3.1 定義核心欄位 15.3.2 建立內部類別WorkThread 15.3.3 建立執行緒池的建構方法 15.3.4 建立執行任務的方法 15.3.5 建立關閉執行緒池的方法 15.3.6 完整原始程式碼範例 ▌15.4 測試程式 ▌15.5 本章複習 16 基於CAS 實現自旋鎖實戰 ▌16.1 案例概述 ▌16.2 專案架設 ▌16.3 核心類別實現 16.3.1 CasLock 介面實現 16.3.2 MyCasLock 類別實現 ▌16.4 測試程式 ▌16.5 本章複習 17 基於讀/ 寫鎖實現快取實戰 ▌17.1 案例概述 ▌17.2 專案架設 ▌17.3 核心類別實現 17.3.1 ReadWriteCache核心介面的實現 17.3.2 ConcurrentReadWriteCache 核心類別的實現 ▌17.4 測試程式 ▌17.5 本章複習 18 基於AQS 實現可重入鎖實戰 ▌18.1 案例概述 ▌18.2 專案架設 ▌18.3 核心類別實現 18.3.1 AQSSync 內部類別的實現 18.3.2 ReentrantAQSLock 核心類別的實現 18.3.3 完整原始程式碼 ▌18.4 測試程式 ▌18.5 本章複習 第4篇 系統架構 19 深度解密分散式鎖架構 ▌19.1 鎖解決的本質問題 ▌19.2 電子商務超賣問題 19.2.1 超賣問題概述 19.2.2 超賣問題案例 ▌19.3 JVM 提供的鎖 19.3.1 JVM 鎖的原理 19.3.2 JVM 鎖的不足 ▌19.4 分散式鎖 19.4.1 分散式鎖的實現方法 19.4.2 分散式鎖的基本要求 ▌19.5 CAP 理論與分散式鎖模型 19.5.1 CAP 理論 19.5.2 基於Redis 的AP 架構模型 19.5.3 基於Zookeeper 的CP架構模型 19.5.4 AP 架構模型的問題與解決方案 ▌19.6 基於Redis 實現分散式鎖 19.6.1 Redis 命令分析 19.6.2 引入分散式鎖 19.6.3 引入try-finally 程式區塊 19.6.4 引入Redis 逾時機制 19.6.5 加鎖操作原子化 19.6.6 誤刪鎖分析 19.6.7 實現加鎖和解鎖歸一化 19.6.8 可重入性分析 19.6.9 解決可重入性問題 19.6.10 實現鎖的阻塞性 19.6.11 解決鎖故障問題 19.6.12 解鎖操作原子化 ▌19.7 本章複習 20 深度解密秒殺系統架構 ▌20.1 電子商務系統架構 ▌20.2 秒殺系統的特點 20.2.1 秒殺系統的業務特點 20.2.2 秒殺系統的技術特點 ▌20.3 秒殺系統的方案 20.3.1 秒殺系統的三個階段 20.3.2 秒殺系統的性能最佳化 ▌20.4 秒殺系統設計 20.4.1 同步下單流程 20.4.2 非同步下單流程 ▌20.5 扣減庫存設計 20.5.1 下單減庫存 20.5.2 付款減庫存 20.5.3 預扣減庫存 20.5.4 扣減庫存問題的解決方案 20.5.5 秒殺系統扣減庫存方案 ▌20.6 Redis 助力秒殺系統 20.6.1 Redis 實現扣減庫存 20.6.2 完美解決超賣問題 20.6.3 Redis 分割庫存 20.6.4 快取穿透技術 ▌20.7 伺服器性能最佳化 20.7.1 作業系統參數 20.7.2 最佳化通訊端緩衝區 20.7.3 最佳化頻繁接收大檔案 20.7.4 最佳化TCP 連接 ▌20.8 本章複習
作者簡介 冰河 互聯網資深技術專家、MySQL 技術專家、分散式與微服務架構專家。 多年來一直致力於分散式系統架構、微服務、分散式資料庫、分散式事務與大數據技術的研究,在高併發、高可用、高可擴充性、高可維護性和大數據等領域擁有豐富的架構經驗。 可視化多數據源數據異構中間件 mykit-data 作者,暢銷書《深入理解分散式事務:原理與實戰》《海量數據處理與大數據技術實戰》和《MySQL 技術大全:開發、優化與運維實戰》作者,“冰河技術”微信公眾號作者。
客服公告
热门活动
订阅电子报