Java 並發實現原理:JDK 源碼剖析

餘春龍

  • 出版商: 電子工業
  • 出版日期: 2020-03-01
  • 定價: $534
  • 售價: 8.5$454
  • 語言: 簡體中文
  • 頁數: 256
  • 裝訂: 平裝
  • ISBN: 7121379724
  • ISBN-13: 9787121379727
  • 相關分類: Java
  • 立即出貨 (庫存 < 4)

買這商品的人也買了...

商品描述

本書全面而係統地剖析了Java Concurrent包中的每一個部分,對並發的實現原理進行了深入的探討。
全書分為8章,第1章從基礎的多線程知識講起,釐清多線程中容易誤解的知識點,
探究背後的原理,包括內存重排序、happen-before、內存屏障等;
第2~8章,從簡單到復雜,逐個剖析Concurrent包的每個部分,包括原子類、鎖、
同步工具類、並發容器、線程池、ForkJoinPool和CompletableFuture。


本書適合有一定Java開發經驗的工程師、架構師閱讀。
通過閱讀本書,讀者可以對多線程編程形成一個“深刻而直觀”的認識,而不是僅僅停留在概念和理論層面。

作者簡介

余春龍

中科院軟件所計算機碩士畢業。
熱衷於高並發高可用架構、業務建模、領域驅動設計,在十年的工作中,
經歷過遊戲、社交、廣告、電商等各種類型的項目,積累了較豐富的工程經驗。

目錄大綱

第1章多線程基礎
1.1 線程的優雅關閉
1.1.1 stop與destory函數
1.1.2 守護線程
1.1.3 設置關閉的標誌位
1.2 InterruptedException與interrupt()函數
1.2.1 什麼情況下會拋出Interrupted異常
1.2.2 輕量級阻塞與重量級阻塞
1.2.3 t.isInterrupted()與Thread.interrupted()的區別
1.3 synchronized關鍵字
1.3.1 鎖的對像是什麼
1.3.2 鎖的本質是什麼
1.3.3 synchronized實現原理
1.4 wait與notify
1.4.1 生產者?消費者模型
1.4.2 為什麼必須和synchronized一起使用
1.4.3 為什麼wait()的時候必須釋放鎖
1.4 wait()與notify()的問題
1.5 volatile關鍵字
1.5.1 64位寫入的原子性(Half Write)
1.5.2 內存可見性
1.5.3 重排序:DCL問題
1.6 JMM與happen-before
1.6.1 為什麼會存在“內存可見性”問題
1.6.2 重排序與內存可見性的關係
1.6.3 as-if-serial語義
1.6.4 happen-before是什麼
1.6.5 happen-before的傳遞性
1.6.6 C++中的volatile關鍵字
1.6.7 JSR-133對volatile語義的增強
1.7 內存屏障
1.7.1 Linux中的內存屏障
1.7.2 JDK中的內存屏障
1.7.3 volatile實現原理
1.8 final關鍵字
1.8.1 構造函數溢出問題
1.8.2 final的happen-before語義
1.8.3 happen-before規則總結
1.9 綜合應用:無鎖編程
1.9.1 一寫一讀的無鎖隊列:內存屏障
1.9.2 一寫多讀的無鎖隊列:volatile關鍵字
1.9.3 多寫多讀的無鎖隊列:CAS
1.9.4 無鎖棧
1.9.5 無鎖鍊錶

第2章Atomic類
2.1 AtomicInteger和AtomicLong
2.1.1 悲觀鎖與樂觀鎖
2.1.2 Unsafe 的CAS詳解
2.1.3 自旋與阻塞
2.2 AtomicBoolean和AtomicReference
2.2.1 為什麼需要AtomicBoolean
2.2.2 如何支持boolean和double類型
2.3 AtomicStampedReference和AtomicMarkable Reference
2.3.1 ABA問題與解決辦法
2.3.2 為什麼沒有AtomicStampedInteger或AtomictStampedLong
2.3.3 AtomicMarkableReference
2.4 AtomicIntegerFieldUpdater、AtomicLongFieldUpdater和AtomicReferenceField Updater
2.4.1 為什麼需要AtomicXXXFieldUpdater
2.4.2 限制條件
2.5 AtomicIntegerArray、AtomicLongArray和AtomicReferenceArray
2.5.1 使用方式
2.5.2 實現原理
2.6 Striped64與LongAdder
2.6.1 LongAdder原理
2.6.2 最終一致性
2.6.3 偽共享與緩存行填充
2.6.4 LongAdder核心實現
2.6.5 LongAccumulator
2.6.6 DoubleAdder與DoubleAccumulator

第3章Lock與Condition
3.1 互斥鎖
3.1.1 鎖的可重入性
3.1.2 類繼承層次
3.1.3 鎖的公平性vs.非公平性
3.1.4 鎖實現的基本原理
3.1.5 公平與非公平的lock()實現差異
3.1.6 阻塞隊列與喚醒機制
3.1.7 unlock()實現分析
3.1.8 lockInterruptibly()實現分析
3.1.9 tryLock()實現分析
3.2 讀寫鎖
3.2.1 類繼承層次
3.2.2 讀寫鎖實現的基本原理
3.2.3 AQS的兩對模板方法
3.2.4 WriteLock公平vs.非公平實現
3.2.5 ReadLock公平vs.非公平實現
3.3 Condition
3.3.1 Condition與Lock的關係
3.3.2 Condition的使用場景
3.3.3 Condition實現原理
3.3.4 await()實現分析
3.3.5 awaitUninterruptibly()實現分析
3.3.6 notify()實現分析
3.4 StampedLock
3.4.1 為什麼引入StampedLock
3.4.2 使用場景
3.4.3 “樂觀讀”的實現原理
3.4.4 悲觀讀/寫:“阻塞”與“自旋”策略實現差異

第4章同步工具類
4.1 Semaphore
4.2 CountDownLatch
4.2.1 CountDownLatch使用場景
4.2.2 await()實現分析
4.2.3 countDown()實現分析
4.3 CyclicBarrier
4.3.1 CyclicBarrier使用場景
4.3.2 CyclicBarrier實現原理
4.4 Exchanger
4.4.1 Exchanger使用場景
4.4.2 Exchanger 實現原理
4.4.3 exchange(V x)實現分析
4.5 Phaser
4.5.1 用Phaser替代CyclicBarrier和CountDownLatch
4.5.2 Phaser新特性
4.5.3 state變量解析
4.5.4 阻塞與喚醒(Treiber Stack)
4.5.5 arrive()函數分析
4.5.6 awaitAdvance()函數分析

第5章並發容器
5.1 BlockingQueue
5.1.1 ArrayBlockingQueue
5.1.2 LinkedBlockingQueue
5.1.3 PriorityBlockingQueue
5.1.4 DelayQueue
5.1.5 SynchronousQueue
5.2 BlockingDeque
5.3 CopyOnWrite
5.3.1 CopyOnWriteArrayList
5.3.2 CopyOnWriteArraySet
5.4 ConcurrentLinkedQueue/ Deque
5.5 ConcurrentHashMap
5.5.1 JDK 7中的實現方式
5.5.2 JDK 8中的實現方式
5.6 ConcurrentSkipListMap/Set
5.6.1 ConcurrentSkipListMap
5.6.2 ConcurrentSkipListSet

第6章線程池與Future
6.1 線程池的實現原理
6.2 線程池的類繼承體系
6.3 ThreadPoolExecutor
6.3.1 核心數據結構
6.3.2 核心配置參數解釋
6.3.3 線程池的優雅關閉
6.3.4 任務的提交過程分析
6.3.5 任務的執行過程分析
6.3.6 線程池的4種拒絕策略
6.4 Callable與Future
6.5 ScheduledThreadPool Executor
6.5.1 延遲執行和周期性執行的原理
6.5.2 延遲執行
6.5.3 週期性執行
6.6 Executors工具類

第7章ForkJoinPool
7.1 ForkJoinPool用法
7.2 核心數據結構
7.3 工作竊取隊列
7.4 ForkJoinPool狀態控制
7.4.1 狀態變量ctl解析
7.4.2 阻塞棧Treiber Stack
7.4.3 ctl變量的初始值
7.4.4 ForkJoinWorkerThread狀態與個數分析
7.5 Worker線程的阻塞-喚醒機制
7.5.1 阻塞–入棧
7.5.2 喚醒–出棧
7.6 任務的提交過程分析
7.6.1 內部提交任務pushTask
7.6.2 外部提交任務addSubmission
7.7 工作竊取算法:任務的執行過程分析
7.7.1 順序鎖SeqLock
7.7.2 scanGuard解析
7.8 ForkJoinTask的fork/join
7.8.1 fork
7.8.2 join的層層嵌套
7.9 ForkJoinPool的優雅關閉
7.9.1 關鍵的terminate變量
7.9.2 shutdown()與shutdownNow()的區別

第8章CompletableFuture
8.1 CompletableFuture用法
8.1.1 最簡單的用法
8.1.2 提交任務:runAsync與supplyAsync
8.1.3 鍊式的CompletableFuture:thenRun、thenAccept和thenApply
8.1.4 CompletableFuture的組合:thenCompose與thenCombine
8.1.5 任意個CompletableFuture的組合
8.2 四種任務原型
8.3 CompletionStage接口
8.4 CompletableFuture內部原理
8.4.1 CompletableFuture的構造:ForkJoinPool
8.4.2 任務類型的適配
8.4.3 任務的鍊式執行過程分析
8.4.4 thenApply與thenApplyAsync的區別
8.5 任務的網狀執行:有向無環圖
8.6 allOf內部的計算圖分析