CAS--->比较并交换(CompareAndSet)

CAS

什么是CAS

package com.chao.cas;

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());
//        atomicInteger.getAndIncrement(); //++
        System.out.println(atomicInteger.compareAndSet(2020, 2021));
        System.out.println(atomicInteger.get());

    }
}

Unsafe 类

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

缺点:

1、循环会耗时

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

3、ABA问题

CAS : ABA问题(狸猫换太子)

package com.chao.cas;
import java.util.concurrent.atomic.AtomicInteger;
public class CASDemo {

    //CAS compareAndSet: 比较并交换!
    public static void main(String[] args) {
        AtomicInteger atomicInteger = new AtomicInteger(2020);      
        //对于我们平时写的SQL ; 乐观锁!
        //期望、更新
        //public final boolean compareAndSet(int expect, int update)
        //如果我期望的值达到了,那么就更新,否则,就不更新,CAS 是CPU的并发原语!
        //=================== 捣乱的线程 =======================
        System.out.println(atomicInteger.compareAndSet(2020, 2021));;
        System.out.println(atomicInteger.get());

//        atomicInteger.getAndIncrement(); //++
        System.out.println(atomicInteger.compareAndSet(2021, 2020));
        System.out.println(atomicInteger.get());
        //=================== 期望的线程 =======================
        System.out.println(atomicInteger.compareAndSet(2020, 6666));
        System.out.println(atomicInteger.get());

    }
}

posted on 2021-05-13 21:01  追梦王子  阅读(242)  评论(0)    收藏  举报