atomic不会阻塞线程。是加强版的volatile原子操作。主要用于高并发环境高效程序处理
了解volatile
- 修饰变量
- 易变的、不稳定的
- 从内存种获取值
- 读取/写入不需要锁
- 提供了内存可见性,但是没提供原子性。不适用高并发场景
volatile与加锁机制主要的区别:前者只提供了内存可见性。后者还提供了原子性
atomic处理类
java.util.concurrent.atomic
- 基本类: AtomicInteger、AtomicLong、AtomicBoolean
- 引用类型: AtomicReference
- 数组类型: AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray
- 属性原子修改器: AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicReferenceFieldUpdater、
相关api
get() 获取值
getAndSet() 取当前值并设置新值
getAndIncrement() 获取当前的值,自增
getAndDecrement() 获取当前的值,自减
getAndAdd() 获取当前的值,加上预期值
public static void main(String[] args) {
AtomicInteger atomicNumber = new AtomicInteger(0);
System.out.println(atomicNumber.get());//0
System.out.println(atomicNumber.getAndSet(7));//0
System.out.println(atomicNumber.getAndIncrement());//7
System.out.println(atomicNumber.getAndDecrement());//8
System.out.println(atomicNumber.getAndAdd(10));//7
System.out.println(atomicNumber.get());//17
}
原理:利用CPU比较并交换(CAS) 和 非阻塞算法。有些方法是通过调用JNI(JavaNativeInterface)实现的