聊聊高併發(三十七)整理一下併發基礎中的一些知識點
最近在準備併發基礎的PPT,想到了一些知識點,記錄下來以後也可以做個參考。大部分的知識點在之前的部落格中都多少涉及到了
這裡的併發基礎指的是單機多處理器的情況下的一些併發問題,不涉及到分散式環境下的併發問題。
併發基礎主要解決的是可見性,有序性和原子性的問題,讓不可控的程序/執行緒變得可以預測,可以控制行為。
Java解決可見性/有序性的主要技術是通過Java記憶體模型來解決的。Java記憶體模型這個域裡面有這些知識點
1. 可見性問題的根源 -- CPU寫操作的延遲
2. 造成寫操作延遲的原因主要是快取記憶體的存在,理解快取的原理,區域性性原理,快取記憶體的原理等
3. 解決可見性問題的通用方法 -- 確定一致性需求。有多種一致性模型:線性一致性,順序一致性,因果一致性,處理器一致性,弱一致性,釋放一致性,進入一致性等等
4. 底層硬體提供了實現一致性需求的能力 -- 記憶體屏障,比如X86的mfence, sfence, lfence, Lock字首等等,理解Lock字首的語義
5. 底層硬體提供了快取一致性協議來提供底層同步快取的能力,注意匯流排的互斥性,快取一致性流量等
6. Java記憶體模型是語義級的記憶體模型,主要是遮蔽底層硬體提供的記憶體模型能力的差異,提供了一系列的Java同步操作語法,制定了Happens-before規則
7. 理解volatile, synchronized, CAS等操作的底層實現原理
8. 理解Happens-before規則描述的是可見性的問題
9. 理解指令重排序的概念,理解有序性
Java解決原子性的問題主要是通過鎖/互斥來實現的,鎖這個問題域裡面有這些知識點
1. 鎖的原理,飢餓,公平,自旋,阻塞,管程,條件佇列等等概念
2. 併發程式設計的三個重要特性:可見性,有序性和原子性。鎖解決的問題域
3. 執行緒在各個層面的狀態控制,JVM中如何實現執行緒,作業系統如何實現執行緒,執行緒排程
4. 自旋 VS 阻塞
5. 多種經典的自旋鎖的實現,比如TAS/TTAS/CLH/MCS lock
6. 讀寫鎖,可重入鎖,時限鎖的原理和實現
7. Object.wait(), Object.notify, Condition等條件佇列操作的底層原理
8. sun.misc.Unsafe類提供的同步能力
9. Java併發包中的AQS同步器的設計和重點實現
10. Java併發包中的Semaphore, CountDownLatch, CyclicBarrier等同步器的實現
11. 一些無鎖的資料結構的設計思路及實現,比如無鎖佇列
12.鎖的優化,比如控制鎖的粒度,鎖分段,識別和解決死鎖/活鎖等
理解了可見性,有序性,原子性的原理和底層實現之後,需要理解一下併發場景下的一些通用的設計思路,高效能伺服器的設計思路
1. 如何安全釋出一個物件
2. 執行緒封閉技術,不可變物件的使用
3. 控制鎖的粒度,鎖分段,CopyOnWrite等優化
4. 生產者消費模型
5. 執行緒池的設計和實現
6. 同步操作轉非同步操作
7. 5種IO模型的理解
8. 高效能伺服器的執行緒模型設計, reactor / proactor
9. 使用高效的網路傳輸 -- NIO的原理,設計和實現,比如epoll / selector / pull, Buffer的使用
10. 多程序監聽一個埠 vs 單程序監聽一個埠, nginx的驚群問題分析