CAS詳解附原始碼

2021-10-06 05:31:20 字數 980 閱讀 7300

cas 也就是compareandswap 比較並交換,主要為了解決多執行緒下的原子性,大體思想就是在更新前,進行比較,舉個例子atomicinteger 下的compareandset(expect,update) expect 為期望值也就是未更新的值,update是如果期望值相同則更新的值。

首先compareandse呼叫了rt.jar下的unsafe類,這個類下的大部分方法和變數都用native修飾,也就是說更多的是操作是面向位址的,也就是當我們呼叫時會形成系統原語,原語的執行是連續的,因此保證原子性。

如何保證原子性

1.在compareandset方法下的第一層

// setup to use unsafe.compareandswapint for updates

private static final unsafe unsafe = unsafe.getunsafe();

private static final long valueoffset

static  catch (exception ex) 

}private volatile int value;

public final int getandincrement()
unsafe.class下的實現

public final int getandaddint(object var1, long var2, int var4)  while(!this.compareandswapint(var1, var2, var5, var5 + var4)

* //cas比較如果為true跳出迴圈var5+var4執行加操作反之亦然);

** return var5;

* }

底層實現使用了do while 因此消耗位址

2.只能保證乙個共享變數的原子操作

android 瀑布流的實現詳解,附原始碼

參考自 因為原來的 封裝不好,所以,我根據原始碼的思路,重新寫了一遍,所以有了現在這個專案 原作者表示 試過在1萬張可以流暢的滑動,不出現記憶體溢位情況 之前的作者的自定義view 只有主滑動一層,其他的設定要在相應的活動設定,個人覺得,重用起來比較麻煩,所以決定封裝一層.現在定義乙個預設的瀑布流只...

GL 遊戲演算法(附原始碼)

gl遊戲規則 有個列相當長的格仔 格仔總數不超過10的四次方 某些格仔裡面放了棋子 棋子總數足夠多 1.如果格仔裡面有棋子,就可以少拿走其中一顆,同時在這個格仔的左邊兩個格仔裡面各放一顆 2.如果連續兩個格仔裡面都有棋子,可以分別從兩個格仔中都拿走一顆,並在她們右邊的格仔裡面放入一顆 輸入初始狀態,...

小波分析(附原始碼)

前幾天深受小波的毒害,狠狠看了幾天,算是有點成果。然後後面附上db2小波的解構與重構的matlab原始碼。首先要把傅利葉給弄懂了,傅利葉變換,是把時域的訊號,寫成了基為不同頻率的三角函式的形式,然後,以三角函式的頻率和幅值分別為x軸y軸建立頻譜。說來說去,傅立 葉就是以三角函式為基的,而且這些基是兩...