CAS,ABA,volatile特性?
CAS 操作包含三個運算元 —— 記憶體位置(V)、預期原值(A)和新值(B),如果記憶體地址里面的值和A的值是一樣的,那么就將記憶體里面的值更新成B,CAS是通過無限回圈來獲取資料的,若果在第一輪回圈中,a執行緒獲取地址里面的值被b執行緒修改了,那么a執行緒需要自旋,到下次回圈才有可能機會執行,
ABA 問題:CAS演算法實作一個重要前提需要取出記憶體中的某時刻的資料并在當下時刻比較并交換,那么在這個時間差類會導致資料的變化,比如,一個執行緒one從記憶體位置V中取出A,這個時候另外一個執行緒two也從記憶體中取出A,并且執行緒two進行了一些操作,將值變成了B,然后執行緒two又將V位置的資料變成A,這個時候執行緒one進行CAS操作發現記憶體中仍然是A,然后執行緒one操作成功,盡管執行緒one的CAS操作成功,但是不代表這個程序就是沒有問題的,
volatile變數的特性:
可見性:執行緒1從主記憶體中拿資料1到自己的執行緒作業空間進行操作(假設是加1)這個時候資料1已經改為資料2了,將資料2寫回主記憶體時通知其他執行緒(執行緒2,執行緒3),主記憶體中的資料1已改為資料2了,讓其他執行緒重新拿新的資料(資料2),
不保證原子性:執行緒1從主記憶體中拿了一個值為1的資料到自己的作業空間里面進行加1的操作,值變為2,寫回主記憶體,然后還沒有來得及通知其他執行緒,執行緒1就被執行緒2搶占了,CPU分配,執行緒1被掛起,執行緒2還是拿著原來主記憶體中的資料值為1進行加1,值變成2,寫回主記憶體,將主記憶體值為2的替換成2,這時執行緒1的通知到了,執行緒2重新去主記憶體拿值為2的資料,
禁止指令重排:首先指令重排是程式執行的時候不總是從上往下執行的,就像高考答題,可以先做容易的題目再做難的,這時做題的順序就不是從上往下了,禁止指令重排就杜絕了這種情況,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/274439.html
標籤:其他
