天天看點

【程式設計技巧】無鎖并發之原子操作CAS

目錄

前言

李柱明部落格:https://www.cnblogs.com/lizhuming/p/15486895.html

不可被中斷的一個或者一系列操作、

CAS 是 Compare And Set 的縮寫,是以一種 無鎖的方式實作并發控制 。在實際情況下,同時操作同一個對象的機率非常小,是以多數加鎖操作做的是無用功, CAS 以一種樂觀鎖的方式實作并發控制 。

Java 可以通過鎖和循環 CAS 的方式實作原子操作。

Compare And Swap 就是比較并且交換的一個原子操作,由 Cpu 在指令級别上進行保證。

為什麼要有 CAS:因為通過鎖實作原子操作時,其他線程必須等待已經獲得鎖的線程運作完以後才能獲得資源,這樣就會占用系統的大量資源

CAS 包含三個參數:

變量所在記憶體位址 V;

變量對應的值 A;

我們将要修改的值 B。

如果說 V 上的變量的值是 A 的話,就用 B 重新指派,如果不是 A,那就什麼事也不做,操作的傳回結果原值是多少。

循環 CAS:在一個(死)循環【for(;😉】裡不斷進行 CAS 操作,直到成功為止(自旋操作即死循環)。

利用了現代處理器都支援的 CAS 的指令,循環這個指令,直到成功為止

1、 ABA 問題:其他的線程把值改成了 B ,很快改成了 A,原子操作的線程發現值是 A 就修改,這樣會有問題。解決 ABA,引入版本号:1A->2C->3A

2、 循環時間很長的話,cpu 的負荷比較大

3、 對一個變量進行操作可以,同時操作多個共享變量有點麻煩

通過硬體層面的阻塞實作原子操作的安全

數組實作線程安全的循環隊列