1. 程式人生 > >聊聊高併發(三十七)整理一下併發基礎中的一些知識點

聊聊高併發(三十七)整理一下併發基礎中的一些知識點

最近在準備併發基礎的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的驚群問題分析