1. 程式人生 > >多執行緒學習大綱

多執行緒學習大綱

點選一級類目即可跳轉對應的連結

1. 多執行緒基礎概念 5

1.1. 程序,執行緒 5

1.1.1. 程序 5

1.1.2. 執行緒 5

1.2. 序列,併發,並行 6

1.2.1. 序列 6

1.2.2. 併發 6

1.2.3. 並行 6

1.3. 多核下執行緒數量選擇 6

1.3.1. 計算密集型 6

1.3.2. IO密集型 6

1.4. 執行緒分類 6

1.4.1. 守護執行緒 6

1.4.2. 使用者執行緒 6

2. 執行緒的例項化方式 7

2.1. Java執行緒有三種例項化方法 7

2.2. 繼承Thread類 7

2.3. 實現Runnable介面 7

2.4. 實現Callable介面 7

3. 執行緒的常用方法 7

3.1. Object的相關方法 7

3.1.1. wait():執行緒進入等待狀態 7

3.1.2. Notify(),notifyAll():喚醒同步鎖上處於等待狀態的執行緒 8

3.2. Thead的靜態方法 8

3.2.1. sleep():使當前執行緒休眠,但不釋放鎖 8

3.2.2. yield():釋放CPU執行權 8

3.2.3. currentThread():獲得當前執行緒 8

3.3. Thead的非靜態方法 8

T.interrupt():設定當前執行緒為可中斷執行緒。可中斷t.lockInterruptibly()方式加鎖並且處於等待獲取鎖狀態的執行緒。但對於執行中的執行緒不可中斷。 9

3.3.8.1. T.interrupt()和T.isInterrupted()協作來中斷執行緒 9

3.3.8.2. sleep,wait,join中的執行緒被設定為可中斷執行緒時丟擲異常 9

4. 執行緒的生命週期 9

4.1. New 初始化 9

4.2. Runnable 可執行 9

4.3. Running 執行中 9

4.4. Block 阻塞 9

4.4.1. 等待阻塞 9

4.4.2. 同步阻塞 9

4.4.3. 其他阻塞:sleep() , join() , 發出了I/O請求 10

4.5. Dead 消亡 10

4.6. 模型圖1 10

4.7. 模型圖2 10

4.8. 執行緒的控制 11

5. 併發程式設計的機制研究 11

5.1. 生活例項模型 11

5.2. 併發程式設計的通訊機制 11

5.2.1. 讀-寫共享變數:while條件中的共享變數用於執行緒之間的通訊 12

5.2.2. 等待通知機制:通過wait() notify()機制喚醒對應的執行緒 12

5.3. 出現執行緒安全的原因: 12

5.3.1. 主記憶體和工作記憶體資料不一致:JMM模型導致的 12

5.3.2. 指令的重排序:編譯器或處理器導致的 12

5.4. 執行緒安全的處理方案:CAS,volative,synchronized,lock 12

6. java記憶體模型(JMM):共享記憶體的併發模型 12

6.1. 模型結構:記憶體可見性 12

6.2. 問題 12

6.3. 處理方案 12

7. 編譯器/處理器的重排序 12

7.1. 流程 12

7.2. 原則: 13

7.3. as-if-serial規則 13

7.4. happens-before規則 13

7.5. 重排序的規則 13

7.6. 記憶體屏障(Memory Barrier ) 13

8. DCL double-check locks(指令重排序導致的非執行緒安全問題) 14

8.1. 單例模式1: 非執行緒安全模式 14

8.2. 單例模式2:synchronized修改方法塊 14

8.3. 單例模式3:DCL模式:檢查-加鎖-檢查 14

8.4. 最終版:單例模式4:volatile變數禁止指令重排序,讓DCL生效 14

8.5. 常用的單例模式:類初始化時完成例項化 15

9. Volatile-CAS-synchronized-lock對比 15

10. Synchronized:悲觀鎖,可重入鎖 16

10.1. 特點:可重入的鎖 16

10.2. 使用注意事項:區分鎖物件(鎖不同沒有互斥作用) 16

10.3. 原理: 16

10.4. synchronized的happens-before關係:先加鎖後釋放鎖 16

10.5. JMM中的記憶體可見性 16

10.6. Synchronized優化 17

11. volatile:synchronized的輕量級實現 17

11.1. 作用:保證資料的可見性,以及確保變數不會被重排序 17

11.2. 使用案例 17

11.2.1. 和Synchronized結合,用於對變數n讀多寫少的情況 17

11.2.2. 和CAS結合保證操作的原子性,如AtomicInteger 17

11.2.3. 修飾執行緒之間的共享變數 17

11.3. 注意事項:本身不具備執行緒安全的特性 18

12. CAS 18

12.1. 什麼是CAS? 18

12.2. 邏輯說明 18

12.3. 多執行緒環境下的問題 18

12.4. 處理方案:加鎖,volatile變數修飾 18

12.5. CAS的應用步驟 18

12.5.1. 獲取Unsafe的例項 18

12.5.2. 初始化變數的偏移量 18

12.5.3. 變數由volatile關鍵字修飾 18

13. AtomicInteger中CAS-volatile的應用 19

13.1. 簡介 19

13.2. 屬性 19

13.3. 核心方法compareAndSet(int expect, int update) 19

13.4. Get/set/getAndIncrement等方法 19

14. Unsafe中CAS的應用 19

14.1. 例項化 19

14.2. compareAndSwapInt為例 19

14.3. demo 20

15. 執行緒等待通知機制總結 20

 

15.1. 概述 20

15.2. Object.wait()/notify() 21

15.2.1. 使用案例 21

15.2.2. 執行結果 21

15.2.3. 特點 21

15.2.4. 使用場景 22

15.3. LockSupport.park()/unpark() 22

15.3.1. 使用案例 22

15.3.2. 執行結果 22

15.3.3. 特點 22

15.3.4. 使用場景 22

15.4. lock.lock()/unlock()  condition.await()/asignal() 22

15.4.1. 使用案例 22

15.4.2. 執行結果 23

15.4.3. 特點 23

15.4.4. 使用場景 23

 

16. LockSupport原始碼分析 22

16.1. 屬性方法總結 22

16.1.1. final long parkBlockerOffset 執行緒中parkBlocker屬性的偏移量 22

16.1.2. 建構函式:私有,無法被例項化 23

16.1.3. unpark(t):呼叫unsafe的方法,喚醒執行緒t 23

16.1.4. park(Object blocker):阻塞當前執行緒到物件blocker 23

16.1.5. getBlocker/setBlocker: 設定執行緒的阻塞者物件 23

16.2. 對執行緒中斷的響應性研究 23

16.2.1. 程式碼實現 23

16.2.2. 執行結果 23

17. Unsafe原始碼分析 24

17.1. park方法 24

17.2. unpark方法 24

18. Thread原始碼分析 24

18.1. volatile Object parkBlocker 屬性 24

18.2. parkBlocker 使用案例: 24

19. 鎖的分類 25

20. AOS 26

20.1. 鎖持有者管理器AbstractOwnableSynchronizer 26

20.2. 作用:在獨佔模式下,用於設定當前同步物件的佔用執行緒。 26

20.3. 為什麼需要將AQS持有鎖的執行緒的標識向上抽取 26

21. AQS:基於FIFO等待佇列的阻塞鎖 27

21.1. 用來做什麼? 27

21.2. 如何實現的? 27

21.3. 設計思想 27

21.4. 類關係圖 27

21.5. Jdk方法 27

21.5.1. volatile int state 相關:unsafe使用CAS協議實現 27

21.5.2. transient volatile Node head; 28

21.5.3. transient volatile Node tail; 28

21.5.4. 新增釋放鎖方法final 28

21.5.5. isHeldExclusively() 29

21.6. AQS.Node節點詳解 29

21.7. 自定義鎖原始碼實現 30

21.8. AQS中狀態的變更 30

21.9. 頭節點,尾節點設定,waitStatus的更新 30

21.10. AQS.acquire原始碼分析 30

21.11. AQS.release原始碼分析 31

21.12. AQS.acquire----AQS.release流程運轉 32

22. 佇列同步器與鎖的區別聯絡 33

23. Semaphore 訊號量 34

23.1. 使用場景 34

23.2. 方法: 34

23.3. 原始碼分析 34

23.3.1. 構造器new Semaphore(2, boolean fair); 34

23.3.2. acquire() 34

23.3.3. release() 34

23.4. Demo使用案例 34

1.1. 原始碼: 35

1.2. 執行結果 35

24. 常用的資料結構執行緒安全分析 35

24.1. ArrayList非執行緒安全研究 36

24.2. Vector 執行緒安全研究 36

24.3. HashMap  非執行緒安全研究 36

24.4. ConcurrentHashMap  執行緒安全研究 37

2. 資料問題 37

3. MESI 快取一致性協議 38

4. 匯流排Lock 38

25. Synchronized-Lock的區別聯絡 38

25.1. 實現方式 38

25.2. 釋放鎖 39

25.3. 中斷等待狀態的執行緒 39

26. java.util.concurrent.locks包分析 39

26.1. 類關係圖 39

26.2. Lock介面分析 39

26.2.1. 優點 39

26.2.2. 發生異常時,如果沒有主動通過unLock()去釋放鎖,則很可能造成死鎖現象 39

26.2.3. 方法 39

26.3. Condition介面分析 40

26.3.1. 特點 40

26.3.2. 方法 40

26.4. ReadWriteLock介面分析 40

26.4.1. 特點 40

26.4.2. 方法 40

26.5. ReentrantReadWriteLock案例分析 40

26.6. ReentrantLock 可重入的互斥鎖 41

26.6.1. 構造方法 41

26.6.2. 使用案例:生產消費者模型 41

26.7. 常用方法 43