
《Java并發程式設計的藝術》知識點目錄
p1 上下文切換
p1 多線程一定快嗎
p3 為什麼并發執行的速度有時比串行慢
p3 測試上下文切換次數和時長
p3 如何減少上下文切換
P4 減少上下文切換實戰
p5 死鎖
p6 避免死鎖的幾個常見方法
1.3 資源限制的挑戰
p6 資源限制
p8 volatile的定義
p9 一些有關volatile實作原理的cpu術語的定義
p9 volatile是如何實作可見性的
p9 Lock字首指令在多核處理器下引發的事情
p10 volatile的兩條實作原則
p10 緩存一緻性和緩存鎖定
p11 追加64位元組來為volatile優化性能(解決僞共享問題)
p11 不應該追加到64位元組的情況
p12 Java中的每一個對象都可以作為鎖
p12 synchonized在JVM中的實作原理
p12 Java對象頭及其資料組成
p13 鎖的更新與對比
p13 JavaSE1.6以後鎖的四種狀态級别
p13 偏向鎖
p13 偏向鎖的定義、使用和撤銷
p14 偏向鎖獲得和撤銷的流程圖
p14 利用JVM關閉偏向鎖的延遲和徹底關閉偏向鎖
p15 輕量級鎖
p15 輕量級鎖的加鎖和解鎖
p15 輕量級鎖的自旋
P15 争奪鎖導緻的鎖膨脹流程圖
p16 偏向鎖、輕量級鎖、重量級鎖優缺點的對比
p16 緩存行、比較并交換、CPU流水線、記憶體順序沖突定義
p17 處理器如何實作原子操作
p17 使用總線鎖保證原子性
p17 使用緩存鎖保證原子性
P18 使用循環CAS實作原子操作
p19 CAS實作原子操作的三大問題(ABA、循環時間長開銷大、隻能保證一個共享變量的原子操作)
p20 處理器提供的pause指令
p20 使用鎖機制實作原子操作
p21 并發程式設計模型的兩個關鍵問題
p21 線程通信的兩種方式及Java所使用的共享記憶體模型
p22 Java記憶體模型的抽象結構
p22 JMM如何控制Java線程通信
p22 JMM控制下兩個線程通信所必須的步驟
p23 從源代碼到指令序列的重排序
P24 記憶體屏障概念(通過指令禁止特定類型的重排序)
p24 并發程式設計模型的分類
p24 寫緩沖區及其特性
p25 處理器的重排序規則
p26 記憶體屏障類型表
p26 happens-before簡介
p27 happens-before與JMM關系
p28 資料依賴性
p28 as-if-serial語義
p29 程式順序規則
p29 重排序對多線程的影響
p31 控制依賴關系
p31 編譯器和處理器的猜測
p31 重排序緩沖
p31 資料競争與順序一緻性
p31 資料競争
p32 順序一緻性
p32 順序一緻性記憶體模型
p33 讀/寫操作串行化
p34 程式的順序一緻性結果
p35 未同步程式的執行特性
p36 未同步程式在順序一緻性模型和JMM中執行的差異
p36 總線事務
p37 JVM不被強求對64位浮點數的寫操作具有原子性
p38 volatile的特性
p39 volatile寫-讀建立的happens-before關系
p39 volatile寫-讀建立的記憶體語義
p40 volatile寫的記憶體語義
p41 volatile讀的記憶體語義
p42 volatile記憶體語義的實作
p42 volatile重排序規則表
p43 volatile中基于保守政策的JMM記憶體屏障插入政策
p44 為什麼要在volatile寫的後面插入一個StoreLoad屏障
p44 編譯器自動省略不必要的屏障
p45 X86處理器僅對寫-讀操作做重排序
p46 JSR-133為什麼要增強volatile的記憶體語義
p47 volatile和鎖的對比
p47 鎖的釋放-所建立的happens-before關系
p48 鎖的釋放和擷取的記憶體語義
p50 鎖記憶體語義的實作
p50 ReentrantLock的實作依賴于Java同步架構AQS
p51 公平鎖加鎖調用軌迹
p52 公平鎖解鎖調用軌迹
p52 非公平鎖的記憶體語義實作
p52 CAS
P53 CAS是如何同時具有volatile讀和volatile寫的記憶體語義的
p53 intel手冊對lock字首的說明
p54 公平鎖和非公平鎖記憶體語義總結
p54 鎖釋放-擷取記憶體語義的兩種實作
p54 Concurrent包的實作
p54 Java線程通信的四種方式
p54 concurrent包的通用化實作模式
p55 concurrent包的實作示意圖
p55 final域的重排序規則
p55 對于final域,編譯器和處理器要遵守的兩個重排序規則
p56 寫final域的重排序規則
p57 讀final域的重排序規則
p59 final域為引用類型時的重排序規則
p59 為什麼final域不能從構造函數中“溢出”
p62 JSR-133為什麼要增強final的語義
p62 JMM的設計
p62 設計JMM時需要考慮的關鍵因素
p63 JMM對兩種不同類型重排序的不同政策
p63 JMM設計示意圖
p64 happens-before的定義
p65 happens-before規則
p66 start()規則
p66 join()規則
p67 延遲初始化
p68 雙重檢查鎖定(一個錯誤的優化)
p69 問題的根源
p69 intra-thread semantics(允許單線程中不影響結果的重排序)
p71 兩個方法實作線程安全的延遲初始化
p71 基于volatile-利用雙重檢查鎖定實作延遲初始化
p72 基于類初始化過程中的鎖實作延遲初始化
p73 類和接口的初始化時機
p73 類和接口的初始化鎖LC
p73 類和接口的初始化過程(五個階段,下面不再列舉)
p78 對比基于volatile的雙重檢查鎖定的方案和基于類初始化的方案
p78 處理器的記憶體模型
p79 TSO、PSO、RMO、PowerPC記憶體模型
p79 處理器記憶體模型特征表
p80 JMM插入記憶體屏障的示意圖
p80 各種記憶體模型之間的關系
p80 以程式類型分類,三種JMM的記憶體可見性保證
p81 為未同步程式提供的最小安全性保障
p81 各種CPU記憶體模型的強弱對比示意圖
p81 JSR-133 對 JDK5 之前的舊記憶體模型的修補
p82 不同記憶體可見性的三類程式的執行結果對比
p83 什麼是線程
p84 為什麼要使用多線程(更多的處理器核心、更快的響應時間、更好的程式設計模型)
p85 什麼是線程優先級
p85 設定線程優先級的規律
p86 線程優先級不能作為程式正确性的依賴
p87 線程的狀态
p89 Java線程狀态變遷圖
p90 Daemon線程(守護線程)
p91 構造線程
p92 初始化線程對象
p92 啟動線程
p92 了解中斷
p92 抛出InterruptedException之前會清除中斷辨別位
p93 過期的suspend()、resume()和stop()
p95 安全地終止線程
p96 volatile和synchronized關鍵字
p96 每個線程可以擁有對象/對象的成員變量的拷貝
p96 volatile的作用
p96 synchronized的作用
p97 synchronized關鍵字的實作細節
p97 對象的螢幕(monitor)
p98 對象、螢幕、同步隊列和執行線程之間的關系
p98 等待/通知機制
p99 等待/通知相關方法
p100 調用wati()、notify()和notifyAll()時需要注意的細節
p101 等待/通知基本範式(生産者消費者問題)
p102 管道輸入/輸出流(piped)
p103 Thread.join()的使用
p105 ThreadLocal的使用
p106 等待逾時模式
p106 一個簡單的資料庫連接配接池示例
p110 線程池技術及其示例
p114 一個基于線程池技術的簡單Web伺服器
p120 Lock的使用方式
p120 Lock提供的synchoronized沒有的特征(非阻塞擷取鎖、被中斷地擷取鎖、逾時擷取鎖)
p120 Lock的API
p121 隊列同步器AbstractQueuedSynchronizer
p121 同步器提供的三個基本方法 — getState()、setState()和compareAndSetState()
p121 鎖和同步器的關系
p121 隊列同步器的接口與示例
p121 同步器可重寫的方法
p122 同步器提供的模闆方法
p122 獨占鎖
p124 隊列同步器的實作分析
p124 同步隊列
p124 同步隊列中的節點,及其屬性類型與名稱及描述
p125 同步隊列的基本結構
p126 獨占式同步狀态擷取與釋放
p128 獨占式同步狀态擷取流程
p129 共享式同步狀态擷取與釋放
p131 獨占式逾時擷取同步狀态
p133 自定義同步元件 - TwinsLock
p134 自定義同步器定義為自定義同步元件的内部類
p136 重入鎖ReentrantLock
p136 鎖擷取的公平性問題
p136 重進入的實作
p137 公平與非公平擷取鎖的差別
p140 讀寫鎖
p141 讀寫鎖的接口與示例
p141 ReentrantReadWriteLock
p142 讀寫鎖的實作分析
p142 一個整型變量上維護多種狀态 - 按位切割使用
P145 鎖降級
p146 LockSupport提供的阻塞和喚醒方法
p147 阻塞對象Blocker在LockSupport中的作用(由dump展現)
p147 Object的螢幕方法與Condition接口的對比
p148 Condition接口與示例
p148 調用Condition的方法前應該先擷取鎖
p148 Condition的部分方法以及描述
p149 有界隊列
p150 Condition的實作分析
p151 await和signal的實質
p155 為什麼要使用ConcurrentHashMap
p156 鎖分段技術
p156 ConcurrentHashMap的結構
p157 ConcurrentHashMap的初始化
p159 在分段鎖中定位Segment
P160 ConcurrentHashMap的操作(get、put、size)
p160 ConcurrentHashMap的get方法裡将共享變量定義為volatile
p161 實作線程安全的隊列的方法
p162 ConcurrentLinkedQueue的結構
p162 入隊列
p165 HOPS的設計意圖
p163 出隊列
p167 什麼是阻塞隊列
p167 阻塞隊列不可用時由不同方法提供的四種處理方式
p168 JDK7提供的7個阻塞隊列
P168 隊列ArrayBlockingQueue - 數組結構組成的有界阻塞隊列
p169 隊列LinkedBlockingQueue - 連結清單實作的(僞)有界阻塞隊列
p169 隊列PriorityBlockingQueue - 支援優先級的有界阻塞隊列
p169 隊列DelayQueue - 支援延時擷取元素的無界等待隊列
p171 隊列SynchronousQueue - 不存儲元素的阻塞隊列
p171 隊列LinkedTransferQueue - 由連結清單結構組成的無界阻塞隊列
p172 隊列LinkedBlockingDeque - 連結清單結構組成的雙向阻塞隊列
p172 阻塞隊列的實作原理
p174 native方法unsafe.park
p174 JVM實作park方法
p175 什麼是Fork/Join架構
p176 工作竊取算法
p177 Fork/Join架構的設計
p177 RecursiveAction和RecursiveTask
p177 使用Fork/Join架構
p179 Fork/Join架構的異常處理
p179 Fork/Join架構的實作原理
p182 Atomic包
p182 三種原子更新基本類型類(Boolean、Integer、Long)
p184 如何原子更新其他的基本類型
p184 三種原子更新數組(Integer、Long、Reference)
p185 AtomicIntegerArray對内部元素修改時,不影響構造時傳入的數組
p185 三種原子更新引用類型(Reference、ReferenceFieldUpdater、MarkableReference)
P187 三種原子更新字段類(IntegerFieldUpdater、LongFieldUpdater、StampedReference)
p189 CountDownLatch允許一個或多個線程等待其他線程完成操作
p190 join方法
p191 讓一組線程達到後被阻塞的可循環使用屏障CyclicBarrier
p191 CyclicBarrier簡介(使用方式)
p193 CyclicBarrier的應用場景
p195 CyclicBarrier和CountDownLatch的差別
p195 CyclicBarrier的其他有用的方法(reset、isBroken、getNumberWaiting)
P196 信号量Semaphore
p196 Semaphore的應用場景
p197 Semaphore的其他方法
p198 交換者Exchanger
p200 線程池帶來的三個好處
p200 線程池的處理流程
p201 ThreadPoolExecutor執行execute方法的四種情況
p203 線程池的建立和構造參數介紹
p204 四種隊列和線程池都滿了時的飽和政策
p205 向線程池送出任務
p205 關閉線程池
p206 合理配置線程池
p206 線程池的監控
p208 Java線程的執行機制由Executor架構提供
p208 Executor的兩級排程模型
p208 Executor架構的結構與成員
p209 Executor架構的結構
p210 Executor架構的類與接口示意圖
p210 Executor架構的使用示意圖
p210 Executor架構使用流程
p211 Executor架構的成員
p211 ThreadPoolExecutor介紹(FixedThreadPool、SingleThreadExecutor、CachedThreadPool)
p211 ScheduledThreadPoolExecutor介紹(ScheduledThreadPoolExecutor、SingleThreadScheduledExecutor)
p212 Future接口
p212 Runnable接口和Callable接口
p212 把Runnable對象包裝為Callable對象
p213 FixedThreadPool詳解
p214 使用無界隊列作為工作隊列對線程池産生的影響
p214 SingleThreadExecutor詳解
p215 CachedThreadPool詳解
p217 ScheduledThreadPoolExecutor的運作機制
p217 ScheduledThreadPoolExecutor的執行
p218 ScheduledThreadPoolExecutor相比ThreadPoolExecutor做的三個修改
p218 ScheduledThreadPoolExecutor的實作
p218 ScheduledFutureTask的三個成員變量(time、sequenceNumber、period)
p218 ScheduledThreadPoolExecutor中線程執行任務的步驟
P220 DelayQueue擷取任務的三大步驟
P221 DelayQueue添加任務的三大步驟
p222 FutureTask簡介
p222 FutureTask的三種狀态
p222 FutureTask的使用
p224 FutureTask的實作
p227 級聯喚醒