理解CAS

理解CAS

CAS(compare and swap):比较并交换,是CPU并发操作的原语

JUC的atomic包下的类中的操作均为原子性操作,底层均使用的是CAS,是直接对内存的操作

示例代码

package com.example.juc;

import java.util.concurrent.atomic.AtomicInteger;

public class TestCas {


    public static void main(String[] args) {
        AtomicInteger atomicInteger = new AtomicInteger(2021);
        int andIncrement = atomicInteger.getAndIncrement();
        System.out.println(atomicInteger.compareAndSet(2022, 2023));
        System.out.println(atomicInteger);

        System.out.println(atomicInteger.compareAndSet(2021, 2024));
        System.out.println(atomicInteger);
    }
}

源码探究

    public final int getAndIncrement() {
        return unsafe.getAndAddInt(this, valueOffset, 1);
    }

    public final int getAndAddInt(Object o, long offset, int delta) {
        int v;
        // 这个dowhile称为自旋锁
        do {
            v = getIntVolatile(o, offset);
        } while (!compareAndSwapInt(o, offset, v, v + delta));
        return v;
    }

	// native方法是本地方法,调用C++接口实现对内存的操作
    public native int     getIntVolatile(Object o, long offset);
    public final native boolean compareAndSwapInt(Object o, long offset,
                                                  int expected,
                                                  int x);

cas:(CompareAndSwap)比较当前的值如果是期望的,就更新为新值,否则不变。

cas缺点

  1. 循环会耗时
  2. 一次性只能保证一个共享变量的原子性操作
  3. ABA问题
posted @ 2021-12-23 11:31  Oh,mydream!  阅读(29)  评论(0编辑  收藏  举报