Skip to content
DAILY QUOTE

“ ”

什么是CAS

java
package com.mystpet.CASTest;  
  
import java.util.concurrent.atomic.AtomicInteger;  
  
// CAS compareAndSet:比较并交换  
public class CASDemo {  
    public static void main(String[] args) {  
        AtomicInteger atomicInteger = new AtomicInteger(200);  
  
        // 期望、更新  
        // public final boolean compareAndSet(int expect, int update)  
        // 如果我的期望值达到了,那么就会更新,否则,就不更新, CAS 是CPU的并发原语!  
        System.out.println(atomicInteger.compareAndSet(2020,2021));  
        System.out.println(atomicInteger.get());  
  
        System.out.println(atomicInteger.compareAndSet(2021,2020));  
        System.out.println(atomicInteger.get());  
    }  
}

Unsafe类

CAS : 比较当前工作内存中的值和主内存中的值,如果这个值是期望的,那么则执行操作!如果不是就一直循环!

缺点:

1、 循环会耗时

2、一次性只能保证一个共享变量的原子性

3、ABA问题

CAS:ABA问题

例子:

java
package com.mystpet.CASTest;  
  
import java.util.concurrent.atomic.AtomicInteger;  
  
public class CASDemo {  
    // CAS compareAndSet:比较并交换  
    public static void main(String[] args) {  
        AtomicInteger atomicInteger =  new AtomicInteger(2020);  
  
        // 期望、更新  
        // public final boolean compareAndSet(int expect, int update)  
        // 如果我的期望值达到了,那么就会更新,否则,就不更新, CAS 是CPU的并发原语!  
        // ============== 捣乱的线程 ==================        System.out.println(atomicInteger.compareAndSet(2020, 2021));  
        System.out.println(atomicInteger.get());  
  
        System.out.println(atomicInteger.compareAndSet(2021, 2020));  
        System.out.println(atomicInteger.get());  
  
        // ============== 期望的线程 ==================        System.out.println(atomicInteger.compareAndSet(2020, 6666));  
        System.out.println(atomicInteger.get());  
    }  
}

总结:2020->2021->2020 明明被换过但系统只认数值