Java併發編程實戰第二部分學習記錄

在這裏插入圖片描述

14 | Lock和Condition(上):隱藏在併發包中的管程

併發編程領域,有兩大核心問題:一個是互斥,即同一時刻只允許一個線程訪問共享資源;另一個是同步,即線程之間如何通信、協作。這兩大問題,管程都是能夠解決的。Java SDK併發包通過Lock和Condition兩個接口來實現管程,其中Lock用於解決互斥問題,Condition用於解決同步問題。

再造管程的理由

在這裏插入圖片描述
這三種方案可以全面彌補synchronized的問題。到這裏相信你應該也能理解了,這三個方案就是“重複造輪子”的主要原因,體現在API上,就是Lock接口的三個方法。詳情如下:

// 支持中斷的API
void lockInterruptibly() throws InterruptedException;
// 支持超時的API
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
// 支持非阻塞獲取鎖的API
boolean tryLock();

如何保證可見性

它是利用了volatile相關的Happens-Before規則

什麼是可重入鎖

公平鎖與非公平鎖

用鎖的最佳實踐

永遠只在更新對象的成員變量時加鎖
永遠只在訪問可變的成員變量時加鎖
永遠不在調用其他對象的方法時加鎖

15 | Lock和Condition(下):Dubbo如何用管程實現異步轉同步?

那如何利用兩個條件變量快速實現阻塞隊列呢?

同步與異步

Dubbo源碼分析

16 | Semaphore:如何快速實現一個限流器?

信號量模型

如何使用信號量

快速實現一個限流器

Semaphore可以允許多個線程訪問一個臨界區。

現實中還有這種需求?有的。比較常見的需求就是我們工作中遇到的各種池化資源,例如連接池、對象池、線程池等等。其中,你可能最熟悉數據庫連接池,在同一時刻,一定是允許多個線程同時使用連接池的,當然,每個連接在被釋放前,是不允許其他線程使用的。

17 | ReadWriteLock:如何快速實現一個完備的緩存?

那什麼是讀寫鎖呢?

快速實現一個緩存

實現緩存的按需加載

讀寫鎖的升級與降級

18 | StampedLock:有沒有比讀寫鎖更快的鎖?

StampedLock支持的三種鎖模式

ReadWriteLock支持兩種模式:一種是讀鎖,一種是寫鎖。而StampedLock支持三種模式,分別是:寫鎖、悲觀讀鎖和樂觀讀。

進一步理解樂觀讀

StampedLock使用注意事項

19 | CountDownLatch和CyclicBarrier:如何讓多線程步調一致?

利用並行優化對賬系統

用CountDownLatch實現線程等待

進一步優化性能

用CyclicBarrier實現線程同步

20 | 併發容器:都有哪些“坑”需要我們填?

同步容器及其注意事項

List、Map、Set和Queue

併發容器及其注意事項

在這裏插入圖片描述
在這裏插入圖片描述
(一)List
(二)Map
(三)Set
(四)Queue

  1.單端阻塞隊列 2.雙端阻塞隊列 3.單端非阻塞隊列 4.雙端非阻塞隊列

21 | 原子類:無鎖工具類的典範

無鎖方案的實現原理

原子類概覽

在這裏插入圖片描述

  1. 原子化的基本數據類型
  2. 原子化的對象引用類型
  3. 原子化數組
  4. 原子化對象屬性更新器
  5. 原子化的累加器

22 | Executor與線程池:如何創建正確的線程池?

線程池是一種生產者-消費者模式

如何使用Java中的線程池

使用線程池要注意些什麼

23 | Future:如何用多線程實現最優的“燒水泡茶”程序?

如何獲取任務執行結果

實現最優的“燒水泡茶”程序

24 | CompletableFuture:異步編程沒那麼難

CompletableFuture的核心優勢

創建CompletableFuture對象

如何理解CompletionStage接口

CompletionStage接口如何描述串行關係、AND聚合關係、OR聚合關係以及異常處理。

  1. 描述串行關係
  2. 描述AND匯聚關係
  3. 描述OR匯聚關係
  4. 異常處理

25 | CompletionService:如何批量執行異步任務?

利用CompletionService實現詢價系統

那到底該如何創建CompletionService呢?

CompletionService接口說明

利用CompletionService實現Dubbo中的Forking Cluster

26 | Fork/Join:單機版的MapReduce

對於簡單的並行任務,你可以通過“線程池+Future”的方案來解決;如果任務之間有聚合關係,無論是AND聚合還是OR聚合,都可以通過CompletableFuture來解決;而批量的並行任務,則可以通過CompletionService來解決。

分治任務模型

Fork/Join的使用

ForkJoinPool工作原理

模擬MapReduce統計單詞數量

27 | 併發工具類模塊熱點問題答疑

每篇文章的最後都給留了道思考題

1. while(true) 總不讓人省心

2. signalAll() 總讓人省心

3. Semaphore需要鎖中鎖

4. 鎖的申請和釋放要成對出現

5. 回調總要關心執行線程是誰

6. 共享線程池:有福同享就要有難同當

7. 線上問題定位的利器:線程棧dump

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章