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 | 原子類:無鎖工具類的典範
無鎖方案的實現原理
原子類概覽
- 原子化的基本數據類型
- 原子化的對象引用類型
- 原子化數組
- 原子化對象屬性更新器
- 原子化的累加器
22 | Executor與線程池:如何創建正確的線程池?
線程池是一種生產者-消費者模式
如何使用Java中的線程池
使用線程池要注意些什麼
23 | Future:如何用多線程實現最優的“燒水泡茶”程序?
如何獲取任務執行結果
實現最優的“燒水泡茶”程序
24 | CompletableFuture:異步編程沒那麼難
CompletableFuture的核心優勢
創建CompletableFuture對象
如何理解CompletionStage接口
CompletionStage接口如何描述串行關係、AND聚合關係、OR聚合關係以及異常處理。
- 描述串行關係
- 描述AND匯聚關係
- 描述OR匯聚關係
- 異常處理
25 | CompletionService:如何批量執行異步任務?
利用CompletionService實現詢價系統
那到底該如何創建CompletionService呢?
CompletionService接口說明
利用CompletionService實現Dubbo中的Forking Cluster
26 | Fork/Join:單機版的MapReduce
對於簡單的並行任務,你可以通過“線程池+Future”的方案來解決;如果任務之間有聚合關係,無論是AND聚合還是OR聚合,都可以通過CompletableFuture來解決;而批量的並行任務,則可以通過CompletionService來解決。
分治任務模型
Fork/Join的使用
ForkJoinPool工作原理
模擬MapReduce統計單詞數量
27 | 併發工具類模塊熱點問題答疑
每篇文章的最後都給留了道思考題