1、基本介紹atomic,是一種採用樂觀鎖方式實現執行緒安全的;可以高效保證執行緒安全的去更新基本變數,陣列,引用型別;其實現的底層原理是cas;
底層操作邏輯: cas(v,o,n) 三個值分別是 v記憶體位址存放的實際值 o預期的值 n更新的新值; 當v == o表示沒有被其他執行緒更改過,沒有衝突進行更新,則將v賦值; 當v != o的時候,表明值已經被其他執行緒修改,則衝突了,不進行修改;
cas問題:1,aba問題, 當值被修改為b之後又被其他執行緒修改回a的時候,會認為當前執行緒一直是獨佔的,沒有被其他執行緒操作過; 可以通過增加版本號的方式解決;
2,自旋時間過長,在併發性非常高的時候,cas操作經常失敗反而效能會下降;
2,基本型別和api2-1、原子更新基本型別:atomicboolean 、 atomicinteger 、 atomiclong
主要api:atomicinteger為例總結常用的方法
//以原子的方式將例項中的原值加1,返回的是自增前的舊值;
public final int getandincrement()
//getandset(int newvalue):將例項中的值更新為新值,並返回舊值;
public final boolean getandset(boolean newvalue) while (!compareandset(prev, newvalue));
return prev;
}//incrementandget() :以原子的方式將例項中的原值進行加1操作,並返回最終相加後的結果;
public final int incrementandget()
//addandget(int delta) :以原子方式將輸入的數值與例項中原本的值相加,並返回最後的結果;
public final int addandget(int delta)
unsafer類提供了一些底層操作,atomic包下的原子操作類的也主要是通過unsafe類提供的compareandswapint,compareandswaplong等一系列提供cas操作的方法來進行實現
//cas操作
public final boolean compareandset(boolean expect, boolean update)
2-2、原子更新陣列型別 :atomicintegerarray , atomiclongarray, atomicreferencearray
主要api:atomicintegerarray為例總結常用的方法
//addandget(int i, int delta):以原子更新的方式將陣列中索引為i的元素與輸入值相加;
public final int addandget(int i, int delta)
//getandincrement(int i):以原子更新的方式將陣列中索引為i的元素自增加1;
public final int getandincrement(int i)
//compareandset(int i, int expect, int update):將陣列中索引為i的位置的元素進行更新
public final boolean compareandset(int i, int expect, int update)
2-3、原子更新引用型別 :atomicreference 原子更新引用型別 ,
atomicreferencefieldupdater 原子更新引用型別中欄位,
atomicmarkablereference 原子更新帶有標記位的引用型別
2-4、原子更新字段型別 :atomicintegefieldupdater原子更新整型欄位類
atomiclongfieldupdater 原子更新長整型欄位類,
atomicstampedreference原子更新引用型別, 會帶有版本號
原子操作 atomic
所謂的原子操作,取的就是 原子是最小的 不可分割的最小個體 的意義,它表示在多個執行緒訪問同乙個全域性資源的時候,能夠確保所有其他的執行緒都不在同一時間內訪問相同的資源。也就是他確保了在同一時刻只有唯一的執行緒對這個資源進行訪問。這有點類似互斥物件對共享資源的訪問的保護,但是原子操作更加接近底層,因...
原子操作atomic
c 中有atomic類和atomic flag兩個類,其中atomic類用於定義乙個原子操作,atomic flag定義一些與原子操作相關的函式 如下操作 atomic原子操作.cpp 定義控制台應用程式的入口點。一般的操作如上,我們開啟兩個執行緒,定義乙個全域性變數n,定義乙個執行緒函式,想要執行...
atomic原子操作
atomic原子操作在一些場景下,相比於其他的併發原語,效能更優 舉個例子 假設你想在程式中使用乙個標誌 flag,比如乙個 bool 型別的變數 來標識乙個定時任務是否已經啟動執行了,你會怎麼做呢?我們先來看看加鎖的方法。如果使用 mutex 和 rwmutex,在讀取和設定這個標誌的時候加鎖,是...