Atomic原子操作類詳解

2021-09-26 06:08:12 字數 2125 閱讀 6982

1、基本介紹

atomic,是一種採用樂觀鎖方式實現執行緒安全的;可以高效保證執行緒安全的去更新基本變數,陣列,引用型別;其實現的底層原理是cas;

底層操作邏輯:   cas(v,o,n)   三個值分別是 v記憶體位址存放的實際值   o預期的值   n更新的新值;  當v == o表示沒有被其他執行緒更改過,沒有衝突進行更新,則將v賦值;   當v != o的時候,表明值已經被其他執行緒修改,則衝突了,不進行修改;

cas問題:1,aba問題,  當值被修改為b之後又被其他執行緒修改回a的時候,會認為當前執行緒一直是獨佔的,沒有被其他執行緒操作過;  可以通過增加版本號的方式解決;

2,自旋時間過長,在併發性非常高的時候,cas操作經常失敗反而效能會下降;

2,基本型別和api

2-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,在讀取和設定這個標誌的時候加鎖,是...