[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)
- Java
- Object
- 内部类
- 异常
- 注解
- 反射
- 静态代理与动态代理
- 泛型
- 继承
- JVM
- ClassLoader
- String
- 数据结构
- Java集合类
- ArrayList
- LinkedList
- HashSet
- TreeSet
- HashMap
- TreeMap
- HashTable
- 并发集合类
- Collections
- CopyOnWriteArrayList
- ConcurrentHashMap
- Android集合类
- SparseArray
- ArrayMap
- 算法
- 排序
- 常用算法
- LeetCode
- 二叉树遍历
- 剑指
- 数据结构、算法和数据操作
- 高质量的代码
- 解决问题的思路
- 优化时间和空间效率
- 面试中的各项能力
- 算法心得
- 并发
- Thread
- 锁
- java内存模型
- CAS
- 原子类Atomic
- volatile
- synchronized
- Object.wait-notify
- Lock
- Lock之AQS
- Lock子类
- 锁小结
- 堵塞队列
- 生产者消费者模型
- 线程池