Java 模拟 CAS 算法
CAS 簡介
- CAS(Compare-And-Swap)是一種硬體對并發的支援,針對多處理器操作而設計的處理器中的一種特殊指令,用于管理對共享資料的并發通路。
- CAS 是一種無鎖的非阻塞算法的實作。
- CAS 包含了3個操作數
需要讀寫的記憶體值:V
進行比較的值即期望的舊值:A
拟寫入的新值:B
- 當且僅當 V 的值等于 A 的值是,CAS 通過原子方式用新值 B 來更新 V 的值,否則不會執行任何操作。
CAS 算法 Java 實作
package top.simba1949;
public class TestCompareAndSwap {
public static void main(String[] args) {
final CompareAndSwap cas = new CompareAndSwap();
for (int i = 0; i < 100; i++){
new Thread(new Runnable() {
public void run() {
int expectedValue = cas.get();
boolean b = cas.compareAndSet(expectedValue, (int) (Math.random() * 100));
System.out.println(b);
}
}).start();
}
}
}
class CompareAndSwap{
private int value;
/**
* 擷取記憶體值
* @return
*/
public synchronized int get(){
return this.value;
}
/**
* 比較,如果記憶體的舊值和期望的舊值相等,将更新舊值
* @param expectedValue
* @param newValue
* @return
*/
public synchronized int compareAndSwap(int expectedValue, int newValue){
// 取舊值
int oldValue = value;
System.out.println("記憶體值:" + oldValue + ",預估值:" + expectedValue + ",新值:" + newValue);
if (expectedValue == oldValue){
this.value = newValue;
}
return oldValue;
}
/**
* 無論指派成功與否,傳回舊值和期望值是否相等的結果,true 為成功,false 為失敗
* @param expectedValue
* @param newValue
* @return
*/
public synchronized boolean compareAndSet(int expectedValue, int newValue){
return expectedValue == compareAndSwap(expectedValue, newValue);
}
}