zoukankan      html  css  js  c++  java
  • java CAS compareAndSet, compareAndSwap 区别

    之前看源代码的时候,发现了有两个方法。一个是compareAndSet,一个是compareAndSwap, 傻傻分不清这两个到底哪个是CAS呢。

    我看了java并发编程实战 找到了答案。

    CAS 是一种计算机的指令。

    CAS包含3个操作数, 需要读写的内存位置V,进行比较的值A和拟写入的新值B。当且仅当V的值等于A时,CAS才会通过原子方式用新值B来更新V的值,否则不会执行任何操作。无论位置V的值是否等于A,都将返回V原有的值。(这种变化形式被称为比较并设置,无论操作是否成功都会返回。)CAS的含义是 我认为V的值应该为A,如果是,那么将V的值更新为B,否则不修改并告诉V的值实际为多少。

    所以我们来看源代码。

    1     protected final boolean compareAndSetState(int expect, int update) {
    2         // See below for intrinsics setup to support this
    3         return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
    4     }

    上面的代码是AbstractQueuedSynchronizer 这个类中的方法。

    可以看到 compareAndSetState 方法相当于compareAndSet 方法,是一个api。而我们来看它的实现,发现调用unsafe类的compareAndSwapInt。这里unsafe类可以调用计算机底层的东西。

    所以我们可以得出CAS 是指的 compareAndSwap方法,意思是比较并交换。

    java并发编程实战中给出这样一个模拟CAS的操作的示例:

     CAS的典型使用模式是: 首先从V中读取值A,并根据A计算新值B,然后再通过CAS以原子方式将V中的值由A变成B(只要在这期间没有任何线程将V的值修改为其他值)。由于CAS能检测到来自其他线程的干扰,因此即使不使用锁也能够实现原子的读 改 写操作序列。

  • 相关阅读:
    最长严格上升子序列
    01背包
    八数码难题
    跳石头
    立体图
    质因数分解 2012年NOIP全国联赛普及组
    多项式输出 2009年NOIP全国联赛普及组
    绕钉子的长绳子
    数星星
    进制转换
  • 原文地址:https://www.cnblogs.com/liumy/p/11938487.html
Copyright © 2011-2022 走看看