目錄
- 概述
- 線程與鎖
- 函數式編程
- Clojure之道-分離標識與狀態(tài)
- Actor
- 通信順序進程
- 數據并行
- Lambda 架構
- 結束
概述
- 并發(fā) VS 并行
- 并行架構
- 并發(fā):不只是多核
- 七個模型
線程與鎖
Day 1 - 互斥與內存模型
學習:如何創(chuàng)建線程;Java 對象內置鎖實現(xiàn)互斥;線程與鎖模型的三個主要危害:競態(tài)條件、死鎖、內存可見性;
線程與鎖模型,在不同編程語言中普遍適用的原理:
- 對共享變量的所有訪問都需要同步化
- 讀線程和寫線程都需要同步化
- 按照約定的全局順序來獲得多把鎖(對象的散列值)
- 當持有鎖時避免調用外星方法
- 持有鎖的時間盡可能短
Day 2 - 超越內置鎖
- 內置鎖的限制:
- 一個線程等待內置鎖進入阻塞之后,無法中斷線程
- 嘗試獲取內置鎖時,無法設置超時
- 獲得內置鎖,必須使用 Synchronized 塊
- ReentrankLock 提供顯式的Lock 與 Unlock 方法,可解決上述限制。
Lock lock = new ReentrankLock();
lock.lock();
try{
//...
}finally{
lock.unlock();
}
可中斷的鎖-ReentrankLock.lockInterruptibly()
超時-ReentrankLock.tryLock() -> 活鎖現(xiàn)象影響(所有死鎖線程同時超時,極有可能重現(xiàn)陷入死鎖)
交替鎖(hand-over-hand locking)
條件變量 ReentrankLock.newCondition()
原子變量 java.util.concurrent.atomic, 無鎖非阻塞
學習:java.util.concurrent.lock; java.util.concurrent.atomic;
Day 3 - 站在巨人肩上
Java.util.concurrent;
創(chuàng)建線程終極版-使用線程池
寫入時復制, copyOnWriteArrayList 監(jiān)聽器更高效
線程池應該多大:CPU 密集型,線程池大小接近核數;IO 密集型,線程池可以更大一些。最佳方式是真實環(huán)境壓測來衡量性能。
-
詞頻統(tǒng)計
java.util.concurrent.ArrayBlockingQueue 實現(xiàn)生產者與觀察者直接的高效協(xié)作; java.util.concurrent.ConcurrentHashMap 更高效的并發(fā);
總結
線程與鎖模型優(yōu)點是適用面很廣,更接近本質,易于指令式、面向對象語言中實現(xiàn);缺點沒有為并行提供直接支持,不適用于分布式內存模型、不適用于單個系統(tǒng)無力解決的問題。
難點: 難于測試、可維護性低。