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
图片来源:狂神说Java
缺点:
1、循环会耗时
2、一次循环只能保证一个共享变量的原子性
3、ABA问题
ABA问题
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)