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());
}
}
浙公网安备 33010602011771号