CAS算法实现
-
CAS (Compare And Swap):由硬件实现的。
-
CAS 可以将 read-modify-write 这类的操作转换为原子操作。
-
i++ 自增操作包括三个自操作:
-
从主内存读取 i 变量的值
-
对 i 的值加1
-
在把加1之后的值保存到主内存
-
-
CAS原理:在把数据更新到主内存的时候,再次读取主内存变量的值,如果现在变量的值与期望的值(操作起始时读取值)一样就更新。
使用CAS模拟实现计数器
package stu.my.cdn.cas;
/**
* 使用CAS实现一个线程安全的计数器
*/
public class CASTest {
public static void main(String[] args) {
CASCounter casCounter = new CASCounter();
for (int i = 0; i < 10000; i++){
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(casCounter.incrementAndGet());
}
}).start();
}
}
}
class CASCounter{
//使用volatile修饰value,使线程可见
volatile private long value;
private long getValue(){
return value;
}
//定义 compare and swap方法
private boolean conpareAndSwap(long expectedValue,long newValue){
//如果当前线程value的值与期望值expectedValue值一样,就把当前的Value字段替换成newValue值
synchronized (this){
if(value == expectedValue){
value = newValue;
return true;
}else{
return false;
}
}
}
//定义自增方法
public long incrementAndGet(){
long oldValue;
long newValue;
do{
oldValue = value;
newValue = oldValue+1;
}while(!conpareAndSwap(oldValue, newValue));
return value;
}
}