Java并发编程学习七:原子类
一、原子类
1. 简介
在介绍原子类之前,先得了解什么是原子性。所谓原子性,意味着"一组操作要么全都操作成功,要么全都失败,不能只操作成功其中的一部分",而原子类就是有原则性的类。
典型的操作,如i++就是一个非原子性 操作,不能保证线程安全,可以采用原子类的getAndIncrement 方法解决。
原子类和锁都可以保证并发情况下的线程安全,但是相比于锁,原子类有以下的优势:
- 粒度更细:原子变量可以把竞争范围缩小到变量级别,通常情况下,锁的粒度都要大于原子变量的粒度。
- 效率更高:除了高度竞争的情况之外,使用原子类的效率通常会比使用同步互斥锁的效率更高,因为原子类底层利用了 CAS 操作,不会阻塞线程。
2. 6大原子类
原子类一共可以分为6大类
a. Atomic\ 基本类型原子类
这一类称为基本类型原子类,包括三种:AtomicInteger、AtomicLong 和 AtomicBoolean。
以AtomicInteger为例,它是对于 int 类型的封装,并且提供了原子性的访问和更新。在并发场景下,使用该类,就可以不用基本类型 int,也不使用包装类型 Integer,而是直接使用 AtomicInteger。
AtomicInteger 类的常见方法有:
public final int getAndSet(int newValue) //获取当前的值,并设置新的值
public final int getAndIncrement() //获取当前的值,并自增
public final int getAndDecrement() //获取当前的值,并自减
public final int getAndAdd(int delta) //获取当前的值,并加上预期的值
boolean compareAndSet(int expect, int update) //如果输入的数值等于预期值,则以原子方式将该值更新为输入值(update)
b. Array 数组类型原子类
这种数组中的元素都具备原子性,包括三种:
- AtomicIntegerArray:整形数组原子类;
- AtomicLongArray:长整形数组原子类;
- AtomicReferenceArray :引用类型数组原子类。