一、简介
java.util.concurrent 并发包给咱们提供了 12 个原子操作类,它们属于四种类型的原子更新,别离是 原子更新根本类型、原子更新数组、原子更新援用类型和原子更新属性。
这些原子操作类外部都是通过 Unsafe 类提供的一些本地办法(原子操作)来实现的,如大家相熟的 CAS 操作compareAndSwapInt,从主存中读取最新值getIntVolatile 等。
二、原子更新的类型
2.1 原子更新根本类型
以原子的形式更新根本类型,atomic 包提供了 3 个类:
- AtomicBoolean:原子更新布尔类型
- AtomicInteger:原子更新整型
- AtomicLong:原子更新长整型
以上 3 个类提供的办法根本一样,如 AtomicInteger 的局部办法如下:
// 以原子形式将输出的值与实例中的值相加,并返回相加后的值
int addAndGet(int delta)
// 如果输出的值等于预期值,则以原子形式将该值设置为输出的值,胜利返回 true,否则返回 false
boolean compareAndSet(int expect, int update)
// 以原子形式将以后的值加 1,返回自增前的值
int getAndIncrement()
// 以原子形式设置 newValue 的值,并返回旧值
int getAndSet(int newValue)
2.2 原子更新数组
以原子的形式更新数组里的某个元素,atomic 包提供了 3 个类:
- AtomicIntegerArray:原子更新整型数组里的元素
- AtomicLongArray:原子更新长整型数组里的元素
- AtomicReferenceArray:原子更新援用类型数组的元素
这里以 AtomicIntegerArray 为例,其次要是以原子的形式来更新数组里的整型,局部办法如下:
// 以原子形式将输出值与数组中索引 i 的元素相加,并返回
int addAndGet(int i, int delta)
// 如果以后值等于预期值,则以原子形式将数组地位 i 的元素设置成 update 值,胜利返回 true,否则返回 false
boolean compareAndSet(int i, int expect, int update)
2.3 原子更新援用类型
以原子的形式更新援用类型,atomic 包提供了 3 个类:
- AtomicReference:原子更新援用类型
- AtomicStampedReference:原子更新带有版本号的援用类型,能够解决 ABA 问题
- AtomicMarkableReference:原子更新带有标记位的援用类型
这里以 AtomicReference 为例,其次要是以原子的形式来更新援用类型,局部办法如下:
// 如果以后 value 指向的对象与 expect 指向的对象是同一个,则以原子的形式将 value 更新为 update,即 value 指向了 update 所指向的对象。boolean compareAndSet(V expect, V update)
// 以原子的形式将 value 更新为 newValue,并返回 value 的旧值
V getAndSet(V newValue)
2.4 原子更新属性
以原子的形式更新对象里的属性,atomic 包提供了 3 个类:
- AtomicIntegerFieldUpdater:原子更新整型属性
- AtomiceLongFieldUpdater:原子更新长整型属性
- AtomicReferenceFieldUpdater:原子更新援用类型的属性
应用时必须先应用静态方法 newUpdater()创立一个更新器,并且 传入想要更新的类和属性名 。
留神:要更新的字段必须是 volatile 类型的。
样例如下:
private static AtomicIntegerFieldUpdater<User> a = AtomicIntegerFieldUpdater.newUpdater(User.class, "age");
public static class User{
private String name;
public volatile int age;
}