🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## 基本数据类型原子类 * AtomicBoolen: boolean类型原子类 * AtomicInteger: int类型原子类 * AtomicLong: long类型原子类 常用方法(以AtomicInteger为例) * addAndGet(int delta) :以原子方式将输入的数值与实例中原本的值相加,并返回最后的结果; * incrementAndGet() :以原子的方式将实例中的原值进行加1操作,并返回最终相加后的结果; * getAndSet(int newValue):将实例中的值更新为新值,并返回旧值; * getAndIncrement():以原子的方式将实例中的原值加1,返回的是自增前的旧值; ## 数组类型原子类 * AtomicIntegerArray:Int数组类型原子类 * AtomicLongArray:long数组类型原子类 * AtomicReferenceArray:引用类型原子类(关于AtomicReferenceArray即引用类型原子类会在下文介绍) AtomicIntegerArray为例 ~~~ class AtomicDemo { private int[] value = new int[]{0, 1, 2}; private AtomicIntegerArray mAtomicIntegerArray = new AtomicIntegerArray(value); private void doAdd() { for (int i = 0; i < 5; i++) { int value = mAtomicIntegerArray.addAndGet(0, 1); System.out.println(Thread.currentThread().getName() + "--->" + value); } } public static void main(String[] args) { AtomicDemo demo = new AtomicDemo(); new Thread(demo::doAdd, "线程1").start(); new Thread(demo::doAdd, "线程2").start(); } } /程序输出结果如下: 线程1--->1 线程1--->2 线程1--->4 线程2--->3 线程1--->5 线程2--->6 线程1--->7 线程2--->8 线程2--->9 线程2--- ~~~ ## 引用类型原子类 在Java并发编程之Java CAS操作文章中我们曾经提到过两个问题 * 第一个问题:虽然我们能通过循环CAS操作来完成对一个变量的原子操作,但是对于多个变量进行操作时,自旋CAS操作就不能保证其原子性。 * 第二个问题:ABA问题,因为CAS在操作值的时候,需要检查值有没有发生变化,如果没有发生变化则更新,但是如果一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时会发现她的值并没有发生变化。那么会导致程序出问题。 为了解决上述提到的两个问题,Java为我们提供了AtomicReference等系列引用类型原子类,来保证引用对象之间的原子性,即可以把多个变量放在一个对象里来进行CAS操作与ABA问题。主要类型原子类如下: * AtomicReference: * AtomicReferenceFieldUpdater: * AtomicMarkableReference: * AtomicStampedReference: ABA问题带来的隐患,各种乐观锁的实现中通常都会用版本戳version来对记录或对象标记,避免并发操作带来的问题,在Java中,AtomicStampedReference也实现了这个作用,它通过包装\[E,Integer\]的元组来对对象标记版本戳stamp,从而避免ABA问题, ## 参考资料 [Java并发编程:原子类Atomic](https://blog.csdn.net/fei20121106/article/details/83268122)