CAS原理之缓存一致性

本文深入探讨了CAS(Compare and Swap)在保证数据一致性中的作用,通过分析JNI、CPU指令和Java的Unsafe类,揭示了CAS如何在多处理器环境下利用缓存一致性实现原子操作。同时,文章介绍了Intel x86处理器的lock前缀以及其对总线锁和缓存锁的影响,阐述了CAS存在的ABA问题及解决方案,并讨论了其在高竞争场景下的性能开销问题。
摘要由CSDN通过智能技术生成

之前的博客简单提到了CAS保证数据一致性的简单原理,通过一个i++ 的简单原理说明了CAS通过一个预期值的检查来确定当前线程是否被抢占。这次通过将站在编译器与CPU的角度深入理解CAS的原理与缓存一致性等一系列问题。部分引用自《java并发编程的艺术》。

首先还是来看看++i是怎么做到的。

<span style="font-family:SimSun;font-size:14px;">public final int incrementAndGet() {
    for (;;) {
        int current = get();
        int next = current + 1;
        if (compareAndSet(current, next))
            return next;
    }
}</span>
在这里采用了CAS操作,每次从内存中读取数据然后将此数据和+1后的结果进行CAS操作,如果成功就返回结果,否则重试直到成功为止。(最新的jdk1.8是看不到具体代码的,而是封装在unsafe类里面不过代码是差不多的)

而compareAndSet利用JNI来完成CPU指令的操作。

<span style="font-family:SimSun;font-size:14px;">public final boolean compareAndSet(int expect, int update) {   
    return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
    }</span>
整体的过程就是这样子的,利用CPU的CAS指令,同时借助JNI来完成Java的非阻塞算法。其它原子操作都是利用类似的特性完成的。


CAS

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值