乐观锁和悲观锁的理解
乐观锁:乐观的预计,认为冲突的概率很低!过程为:1.修改共享资源 2.验证是否发生冲突 3.若无其他线程修改,完成 4.若存在其他线程修改,放弃本次操作
悲观锁:悲观的预计,认为冲突的频率很高,很容易出现冲突,访问之前需要先上锁,每一时间内只有一个线程访问到共享资源
常见的乐观锁: CAS(compare and swap),比较并交换
原理:当前值V 期望值E 更新值U 当E = V的时候会才能将V变成 U
例如 AtomicInteger 原子类
public final boolean compareAndSet(int expect, int update) { return unsafe.compareAndSwapInt(this, valueOffset, expect, update); }
//本地native方法实现
public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);
public final int getAndAddInt(Object var1, long var2, int var4) {
int var5;
do {
//获取当前的内存旧值 为期望值
var5 = this.getIntVolatile(var1, var2);
//var5+var4为更新值
//var5与内存中的值比较 是否相等,相等则更新为var5+var4
} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
return var5;
}