028-86922220

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

Java中CAS的工作原理是什么

本篇文章给大家分享的是有关Java中CAS的工作原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

网站建设哪家好,找成都创新互联公司!专注于网页设计、网站建设、微信开发、微信平台小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了寿宁免费建站欢迎大家使用!

2.1 何为CAS?

2.2 CAS原理

2.3 CAS核心源码

1、CAS核心源码:

// Adding a lock prefix to an instruction on MP machine
// VC++ doesn't like the lock prefix to be on a single line
// so we can't insert a label after the lock prefix.
// By emitting a lock prefix, we can define a label after it.
#define LOCK_IF_MP(mp) __asm cmp mp, 0  \
                       __asm je L0      \
                       __asm _emit 0xF0 \
                       __asm L0:

inline jint     Atomic::cmpxchg    (jint     exchange_value, volatile jint*     dest, jint     compare_value) {
  // alternative for InterlockedCompareExchange
  int mp = os::is_MP();
  __asm {
    mov edx, dest
    mov ecx, exchange_value
    mov eax, compare_value
    LOCK_IF_MP(mp) // 如果是多处理器的话,则需要添加Lock前缀指令,Lock的方式和Volatile的实现方式雷同
    cmpxchg dword ptr [edx], ecx // 
  }
}

2、通过上述源码可以发现该cmpxchg方法会自动判断当前是否是多处理器,多处理器的话则添加lock前缀指令,反之省略lock前缀;

3、至于lock是怎么保证多处理器的一致性的话,原理和Volatile相似,可见Java技术专题-源码分析系列(1)volatile工作原理分析雷同。

三、CAS缺点

3.1、ABA问题

3.2、开销大

1、随便拿个CAS的Java层代码:

public final int getAndSetInt(Object var1, long var2, int var4) {
        int var5;
        do {
            var5 = this.getIntVolatile(var1, var2);
        } while(!this.compareAndSwapInt(var1, var2, var5, var4));

        return var5;
    }

2、通过这段代码发现,如果CAS操作一直不成功的话,那么该段代码就一直在自旋操作,会给CPU带来比较大的执行开销;

3.3、原子操作约束

四、总结

以上就是Java中CAS的工作原理是什么,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。


本文题目:Java中CAS的工作原理是什么
标题链接:http://www.tsicrk.com/article/gphhdh.html

其他资讯

让你的专属顾问为你服务

0.6150s