JUC–CAS底层


JUC–CAS底层


其实在volatile的时候已经分享过程序原子性问题,而jdk提供的原子对象的底层逻辑就是CAS(compare-And-Swap)。

CAS底层

是硬件底层对于并发操作的支持(非计算机专业的不要求懂,需要汇编知识),volatile+CAS,实现程序并发的原子性

CAS 算法是硬件对于并发操作的支持

  •  	CAS 包含了三个操作数:
  •  	①内存值  V
  •  	②预估值  A
  •  	③更新值  B
  •  	当且仅当 V == A 时, V = B; 否则,不会执行任何操作。

以AtomicInteger为例

    /**
     * Atomically increments by one the current value.
     *
     * @return the previous value
     */

    public final int getAndIncrement() {
        return unsafe.getAndAddInt(this, valueOffset, 1);
    }
    
    public final int getAndAddInt(Object var1, long var2, int var4) {
        int var5;
        do {
            var5 = this.getIntVolatile(var1, var2);//获取内存中最新的旧值
        } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

        return var5;
    }

原子类测试

public class CASDemo {
    public static void main(String[] args) {
        AtomicInteger atomicInteger = new AtomicInteger(1);
        System.out.println(atomicInteger.compareAndSet(1,2020)+"t 当前值:"+atomicInteger.get());
        System.out.println(atomicInteger.compareAndSet(1,2030)+"t 当前值:"+atomicInteger.get());
        atomicInteger.getAndIncrement();
        System.out.println("t 当前值:"+atomicInteger.get());
    }
}

扩展:UNSafe类中的compareAndSwapInt,是一个本地方法,该方法的实现位于unsafe.cpp中

UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSwapInt(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jint e, jint x))
  UnsafeWrapper("Unsafe_CompareAndSwapInt");
  oop p = JNIHandles::resolve(obj);
  jint* addr = (jint *) index_oop_from_field_offset_long(p, offset);
  return (jint)(Atomic::cmpxchg(x, addr, e)) == e;
UNSAFE_END

1、先想办法拿到变量value在内存中的地址。2、通过Atomic::cmpxchg实现比较替换,其中参数x是即将更新的值,参数e是原内存的值。


原文始发于微信公众号(云户):JUC–CAS底层

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/25863.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!