【進階之路】併發程式設計(三)-非阻塞同步機制
阿新 • • 發佈:2021-01-01
## 導言
>這一篇的內容主要來自於《java併發程式設計實戰》,有一說一,看這種寫的很專業的書不是很輕鬆,也沒辦法直接提高多少開發的能力,但是卻能更加夯實基礎,就像玩war3,熟練的基本功並不能讓你快速地與對方拉開差距,但是卻能再每一次團戰中積累優勢。
近年來,併發程式設計的領域更多的偏向於使用非阻塞演算法,這種演算法底層用原子機器指令(如比較交換CAS之類的)來替代鎖用以確保資料在併發訪問中的一致性。這樣的非阻塞演算法廣泛的用於在**作業系統**和**JVM中實現執行緒/程式呼叫機制**、**垃圾回收演算法**等。
![](https://img-blog.csdnimg.cn/img_convert/978ed750ce2047c6ae4bedd6666cb88b.png)
java5.0後,使用**原子變數類**(例如AtomicInteger和AtomicReference)來構建高效的非阻塞演算法。
與基本型別的包裝類相比原子變數類是可修改的,在原子變數類中沒有重新定義hashCode或equals方法,每個例項都是不同的,不宜用做基於雜湊的容器中的鍵值。
原子變數類比鎖的粒度更細量級更輕,將發生競爭的範圍縮小到單個變數上。
從《**併發程式設計實戰**》這本書出發,對給予的用例進行測試,能夠得出的結論:原子變數因其使用CAS的方法,在效能上有很大優勢。
- 1、在沒有競爭的情況下,原子變數的效能更高。
- 2、在中低程度的競爭下,原子變數基於CAS的操作,效能會遠超過鎖。
- 3 在高強度的競爭下,鎖能夠更好地幫助我們避免競爭(類似於,交通略擁堵時,環島疏通效果好,但是當交通十分擁堵時,訊號燈能夠實現更高的吞吐量)。
之前的文章已經講過了**volatitle變數**、**CAS演算法**、**AtomicInteger執行緒安全的原子變數**等,沒有看過或者已經忘記的的同學可以點選下方的藍色連結去看看(複習一下)。
>[【進階之路】包羅永珍——JAVA中的鎖](https://blog.csdn.net/ryc1995/article/details/105208031)
## 非阻塞演算法
**如果一個執行緒的失敗或者掛起不會導致其他執行緒的失敗或掛起,這種演算法就叫做非阻塞演算法**。
### 1、非阻塞棧
在併發訪問的環境下,push和pop方法通過CAS演算法可以保證棧的原子性和可見性,從而安全高效的更新非阻塞棧。
```
//根據《併發程式設計實戰》的程式碼進行分析
public class Cocurr