版权声明:本文为博主原创文章,未经博主允许不得转载。你想转载请附加连接哦 https://blog.csdn.net/dmw412724/article/details/83104903
copare and swap
翻译下来就是比较并转换。
应用环境:
当去修改内存中某个值时,有三个参数条件。
V A B
V是代表此刻内存地址存值。 A是代表此刻内存地址应该有的值 。 B 是新值,即将要赋予的值。
原理:如下代码。
public boolean setNew(){
if (v.value == A){
v.value = B
return true;
}
return false;
}
如果内存存储的是我们的期望值,那么便修改它。否则我不动它。
作用:
在并发环境下,可以保证内存修改的原子性。
并发情况下,不是期望值,那么直接返回,算是失败。然后再次进入该方法,重复上面步骤,直到成功?(这是我推测的,这就是cas自旋吗?)
JAVA:
java1.5之后才实现了cas.
该操作由sun.misc.Unsafe类里面的compareAndSwapInt()和compareAndSwapLong()等几个方法包装提供,虚拟机在内部对这些方法做了特殊处理.java.uti.current.atomic原子包也都使用了Unsafe.
注意:
CAS 存在一个问题,就是一个值从 A 变为 B ,又从 B 变回了 A,这种情况下,CAS 会认为值没有发生过变化.
对此,并发包下倒是有 AtomicStampedReference 提供了根据版本号判断的实现,可以解决一部分问题。