1.概述
- 包: java.util.concurrent.atomic
- 特点: 它提供的方法都是原子性操作,在多线程情况下不会出现线程安全问题
2.分类
原子更新基本类型
如:
- AtomicBoolean 对boolean类型变量实现原子操作
- AtomicInteger 对int/Integer类型变量实现原子操作
原子更新数组
如:
- AtomicIntegerArray 对数组实现原子操作
- AtomicIntegerLongArray
原子更新抽象类
如:
- AtomicReference 对引用类型变量实现原子性操作
原子类更新字段
如:
- AtomicIntegerFieldUpdater 对对象中的int类型变量实现原子性操作
3.实现原理
    public final int incrementAndGet() {
        for (;;) {
            int current = get();    //第一步
            int next = current + 1;    //第二步
            if (compareAndSet(current, next))    //第三步
                return next;
        }
    }- 逻辑分析 - 第一步获取当前的value值current
- 第二步对current进行加一操作获得next
- 第三步为关键步骤,通过对当前值current与next比较,如果符合预期(即只增加了1),则说明没有被其他线程修改过,此时compareAndSet返回true,否则继续循环尝试更新.
 
4.简单实例
4.1简单类型
//获取自增值的类
class Increase{
    //public Integer i = 0; //不使用原子类,赋初始值为0
    public AtomicInteger i = new AtomicInteger(0);  //使用原子类,赋初始值为0
    public Integer getIncrease(){
        //return i++;   //非原子性操作,多线程情况下会出现线程安全问题
        return i.getAndIncrement(); //原子性操作,不会出现线程安全问题
    }
}
//测试类
public class AtomicTest {
    public static void main(String[] args){
        Increase inc = new Increase();
        //线程1
        new Thread(new Runnable() {
            @Override
            public void run() {
                while(true){
                    System.out.println("result1: "+inc.getIncrease());
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
        //线程2
        new Thread(new Runnable() {
            @Override
            public void run() {
                while(true){
                    System.out.println("result2: "+inc.getIncrease());
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
}4.2.原子类更新字段
- 对象所属类
public class User {
    public volatile int age;    //必须使用volatile关键字
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}- 测试类
public class AtomicTest {
    public static void main(String[] args){
        AtomicIntegerFieldUpdater<User> field = AtomicIntegerFieldUpdater.newUpdater(User.class,"age");
        User user = new User();
        user.setAge(0);
        field.getAndIncrement(user);    //更新age值(自增1),此操作为原子操作
        System.out.println(user.age);   //输出age值为1
    }
}