天天看點

《Java并發程式設計的藝術》知識點目錄

《Java并發程式設計的藝術》知識點目錄

《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 級聯喚醒