Java 併發程式設計的藝術概要
重讀下《Java併發程式設計的藝術》,根據目錄以及自己的學習習慣,重新排序了目錄結構,更容易切入。可以根據這些概要更好的複習與回顧。
1.Java 併發程式設計基礎
-
1.1 理解執行緒,分別從 什麼是執行緒、為什麼要使用多執行緒、執行緒優先順序、執行緒的狀態、Daemon執行緒角度來講述
-
1.2 啟動和終止執行緒,分別從構造執行緒、啟動、終斷和終止角度講述
-
1.3 執行緒間通訊,分別從volatile和synchronized 關鍵字、等待通知、管道輸入和輸出、Thread.join()、ThreadLocal使用角度講述
2.Java 中的執行緒池
-
2.1 從執行緒池原理、執行緒池使用:建立、提交任務、關閉、配置、監控角度來講述。補充:知道幾種常見的執行緒池,理解引數配置
-
2.2 流程是提交執行緒-核心執行緒池是否已滿- 佇列是否已滿-執行緒池是否已滿-按照策略處理無法執行的任務
-
2.3 執行緒池基本引數如:corePoolSize執行緒池基本大小-任務佇列-ThreadFactory-執行緒池最大數量-飽和策略
3.Executor 框架
-
3.1 理解Executor介面框架,其成員主要:ThreadPoolExecutor、ScheduledThreadPoolExecutor、Future介面、Runnable介面、Callable介面,工具類Executors
-
3.2 ThreadPoolExecutor詳解,上述框架的核心類,分別從 FixedThreadPool、singleThreadExecutor、CachedThreadPool角度講述
-
3.3 理解一個知識點即:FutureTask,非同步計算的結果,明白其作用、使用、實現原理
4.Java 併發容器和框架
-
4.1 要知道ConcurrentHashMap出現的原因,實現關鍵點記住分段鎖、Segment等,另外同類型的要知道ConcurrentLinkedQueue
-
4.2 知道Java中的阻塞佇列,阻塞佇列實現原理即當佇列滿了不會讓你繼續入隊,出隊同理,典型的阻塞佇列如 ArrayBlockingQueue、LinkedBlockingQueue等
-
4.3 一個少見的知識點 Fork/Join框架
5.Java 中的併發工具類
-
5.1 等待多執行緒完成的 CountDownLatch,允許一個或者多個執行緒等待其他執行緒完成操作
-
5.2 同步屏障 CyclicBarrier ,讓一組執行緒到達一個屏障,直到最後一個執行緒到達,屏障解除。注意對比 CountDownLatch 的區別
-
5.3 控制執行緒併發數的 Semaphore,協調各類執行緒讓其合理的使用公共資源
-
5.4 執行緒間交換資料的 Exchanger
6.Java 中的鎖
-
6.1 Lock介面 其實現原理基本上都是通過聚合了一個AQS的子類來完成執行緒訪問控制的
-
6.2 佇列同步器 AQS是實現鎖的關鍵,其使用一個int成員變量表示同步狀態,通過內建的FIFO佇列完成資源獲取執行緒的排隊工作
-
6.3 重入鎖 ReentrantLock 表示該鎖能夠支援一個執行緒對資源的重複加鎖
-
6.4 讀寫鎖 可以同一時間允許多個執行緒訪問,通過分離讀鎖和寫鎖,併發性比一般的排他鎖有了很大提升
-
6.5 Condition介面,理解它的作用,可以更加精細的控制多執行緒的喚醒與休眠
-
6.x 這部分一個常見的對比就是Sync與Lock的區別聯絡。從中要知道悲觀鎖與樂觀鎖的概念、公平鎖與非公平鎖的概念。
7.Java 併發程式設計底層實現原理
-
7.1 volatile的應用與原理,記住其實現關鍵字記憶體屏障,記得要對比Sync的區別和聯絡
-
7.2 synchronized的實現原理與應用 ,記住JVM基於進入和退出Monitor物件來實現方法和程式碼塊同步的 對於普通方法,鎖是當前例項物件 對於靜態同步方法,鎖是當前類的Class物件 對於同步方法塊,鎖是Sync括號裡配置的物件
-
7.3 原子操作的實現原理,Java中實現原子操作是鎖和CAS操作。CAS操作面臨一個ABA和迴圈時長問題
8.Java 記憶體模型
-
8.1 Java記憶體模型的基礎,關鍵問題:通訊和同步
-
8.2 重排序 編譯器和處理器會對操作進行重排序
-
8.3 順序一致性
-
8.4 volatile的記憶體語義
-
8.5 鎖的記憶體語義
-
8.6 final的記憶體語義 這一點在日常的部落格中見的比較少,切入點可能是在多執行緒如何確保用final修飾的常量不會被改變?或者說final修飾的變數在一個執行緒中被賦值,另一個執行緒中會不會得到同樣的數值?
-
8.7 happens-before,如果一個操作結果需要對另一個操作結果可見,則這兩個操作之間必須具備happens-before關係
-
8.8 雙重檢查鎖定與延遲初始化,經典的單利雙鎖問題
9.Java 中的13個原子操作
10.Java 併發程式設計實戰
- 這部分就理解下生產者與消費者、多生產者與多消費者、執行緒池與生產消費者模式