java并发:CAS

版权声明:本文为博主原创文章,未经博主允许不得转载。你想转载请附加连接哦 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 提供了根据版本号判断的实现,可以解决一部分问题。

猜你喜欢

转载自blog.csdn.net/dmw412724/article/details/83104903