CompareAndSet(CAS)

suaxi
2021-02-21 / 0 评论 / 103 阅读 / 正在检测是否收录...

CompareAndSet(CAS)

CAS

CAS:比较并交换

package com.sw.cas;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @Author suaxi
 * @Date 2021/2/21 20:58
 * CAS:比较并交换
 */
public class casTest {
    public static void main(String[] args) {
        AtomicInteger atomicInteger = new AtomicInteger(2021);

        //如果达到期望的值,就更新,否则反之
        System.out.println(atomicInteger.compareAndSet(2021,666)); //true
        System.out.println(atomicInteger.get()); //666
    }
}


Unsafe

1.getAndIncrement.png

图片来源:狂神说Java

2.自旋锁.png


缺点:

1、循环会耗时

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

3、ABA问题


ABA问题

3.ABA问题.png

package com.sw.cas;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @Author suaxi
 * @Date 2021/2/21 20:58
 * CAS:比较并交换
 */
public class casTest {
    public static void main(String[] args) {
        AtomicInteger atomicInteger = new AtomicInteger(2021);

        //如果达到期望的值,就更新,否则反之
        //捣乱的线程
        System.out.println(atomicInteger.compareAndSet(2021,666)); //true
        System.out.println(atomicInteger.get()); //666

        System.out.println(atomicInteger.compareAndSet(666,2021));
        System.out.println(atomicInteger.get());

        //期望的线程
        System.out.println(atomicInteger.compareAndSet(2021, 888));
        System.out.println(atomicInteger.get());
    }
}
0

评论 (0)

取消