什么是 CAS
- 全称是 Compare-And-Swap,对数据进行 原子性 操作,sun.misc.Unsafe 类的各个 native 方法实现的
- 比较当前工作内存中的值和主内存中的值,如果相同则执行规定操作,否则什么都不做或者重来一次,重来就是自旋锁了 java各种锁看这里
CAS VS volatile VS synchronized
- CAS:保证原子性
- volatile:保证可见性和有序性
- synchronized:保证原子性、可见性和有序性
volatile+CAS 可以做到 synchronized 做的事儿,意味着不需要 synchronized 这个重量级锁也能保证线程安全了
原子类是线程安全的,底层就是使用的 volatile+CAS
原子类
java.util.concurrent.atomic 包下很多已经封装好的原子类(long、int、布尔、数组等)
AtomicInteger atomicInteger = new AtomicInteger(1);
// 这里其实有三个步骤,获取原来的值、比较、赋新值;这个过程是原子性的,没有用 synchronized,底层调用了 Unsafe 的方法
atomicInteger.compareAndSet(1, 2);
atomicInteger.compareAndSet(3, 4);
原子引用类
java.util.concurrent.atomic 下除了提供基本数据类型的原子类,还提供了原子引用类 AtomicReference,用于封装自定义对象
AtomicReference<ShopDto> shopDtoAtomicReference = new AtomicReference<>();
ShopDto shopDto1 = new ShopDto();
shopDto1.setId(1L);
ShopDto shopDto2 = new ShopDto();
shopDto2.setId(2L);
shopDtoAtomicReference.set(shopDto1);
shopDtoAtomicReference.compareAndSet(shopDto1, shopDto2);
标签:synchronized,CAS,ShopDto,原子,volatile,shopDto1
From: https://www.cnblogs.com/hangychn/p/17397307.html