CAS原理:
CAS:Compare and Swap,比较并交换。
CAS有3个操作数,旧的预期值A,内存地址中的值V,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做,可以理解它为一种乐观锁。
Java代码实现:
public class CasTest {
private volatile int value;
public int getValue() {
return this.value;
}
//获取修改前的值
public int getAndAddInt(Object old, int newvalue) {
int value;
do {
//这个值实际上应该是通过old对象和引用地址偏移量获取到的真实内存值,
value = this.getValue();
} while (!this.CompareAndSwap(old, value, newvalue));
return value;
}
// 比较内存值并修改。
public boolean CompareAndSwap(Object old, int core, int update) {
CasTest except = (CasTest) old;
if (except.value == core) {
value = update + core;
return true;
}
return false;
}
public static void main(String[] args) throws InterruptedException {
final CasTest casTest = new CasTest();
for (int i = 0; i < 100; i++) {
new Thread(() -> {
int getInt = casTest.getAndAddInt(casTest, 1);
System.out.println("返回的是修改前的值:" + getInt);
}).start();
}
Thread.sleep(1000);
System.out.println("最终结果值: " + casTest.getValue());
}
}
上述代码实现中有两个点:
1、volatile 关键字保证了多线程下变量的可见性。
2、do while 循环进行比较并修改内存值,保证修改变量的原子性。
如有理解不到位的地方还请指出!