乐观锁不是一种锁,而是一种编程思想,指的是更新值的时候采用CAS的机制,CAS过程是原子的
1、使用synchronized实现
public class MyCAS {
volatile private int count;
public boolean compareAndSet(int expect, int update){
if(expect==getCount()){//1、比较期望值与当前值是否相等,不相等直接返回false
synchronized (this){//2、进行CAS原子操作
if(expect==getCount()){
count=update;//3、与期望值相等,把当前值改成更新后的值
}
}
}
return false;
}
public int getAndSetInt(int expect, int update){
int var;
do {
var=getCount();
}while (!this.compareAndSet(var,update));
return var;
}
public int getCount() {
return count;
}
}
总结:
1、可以看出使用synchronized实现的CAS有点类似DCL单例模式,所以说编程是相通的,重要的是思想
2、Java底层的CAS使用的是Unsafe类,汇编原语是cmpxchg,多核环境下会锁总线