Java cas可以了解為compareAndSetVlaue(T expect, T update)或者說compareAndSwapValue(T expect, T update)。比如在AQS中有個int state變量,通過cas原子更新,compareAndSetState(int expect, int update),比較state目前值和expect是否相同,相同更新為update,否則不更新。
CAS原子為了使原子操作不用阻塞線程,減少線程挂起和恢複,線程狀态切換的消耗。CAS一次更新不成功可以多次更新,不用挂起線程,切換線程。适合對資料操作時間短的場景。需要CPU提供CAS這種原子指令的支援。
《Java并發程式設計實戰》中給出了CAS模拟代碼
SimulateCAS.java
1 public class SimulateCAS {
2 private static int index;
3
4 private int value;
5 public synchronized int get(){
6 return value;
7 }
8
9 public synchronized int compareAndSwap(int expectedValue, int newValue){
10 int oldValue = value;
11 if(oldValue == expectedValue)
12 value = newValue;
13 return oldValue;
14 }
15
16 public synchronized boolean compareAndSet(int expectedValue, int newValue){
17 return (expectedValue == compareAndSwap(expectedValue, newValue));
18 }
19 }
CasCounter.java
1 public class CasCounter {
2 private SimulateCAS value;
3
4 public CasCounter(SimulateCAS value){
5 this.value = value;
6 }
7 public int getValue(){
8 return value.get();
9 }
10
11 public int increment(){
12 int v;
13 do{
14 v = value.get();
15 }while(v != value.compareAndSwap(v, v + 1));
16
17 return v + 1;
18 }
19 }