理解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缺点
- 循环会耗时
- 一次性只能保证一个共享变量的原子性操作
- ABA问题
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号