乐趣区

关于java:JAVA并发编程Atomic原子操作类的整理

一、简介

java.util.concurrent 并发包给咱们提供了 12 个原子操作类,它们属于四种类型的原子更新,别离是 原子更新根本类型、原子更新数组、原子更新援用类型和原子更新属性

这些原子操作类外部都是通过 Unsafe 类提供的一些本地办法(原子操作)来实现的,如大家相熟的 CAS 操作compareAndSwapInt,从主存中读取最新值getIntVolatile 等。

二、原子更新的类型

2.1 原子更新根本类型

以原子的形式更新根本类型,atomic 包提供了 3 个类:

  1. AtomicBoolean:原子更新布尔类型
  2. AtomicInteger:原子更新整型
  3. 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 个类:

  1. AtomicIntegerArray:原子更新整型数组里的元素
  2. AtomicLongArray:原子更新长整型数组里的元素
  3. 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 个类:

  1. AtomicReference:原子更新援用类型
  2. AtomicStampedReference:原子更新带有版本号的援用类型,能够解决 ABA 问题
  3. 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 个类:

  1. AtomicIntegerFieldUpdater:原子更新整型属性
  2. AtomiceLongFieldUpdater:原子更新长整型属性
  3. AtomicReferenceFieldUpdater:原子更新援用类型的属性

应用时必须先应用静态方法 newUpdater()创立一个更新器,并且 传入想要更新的类和属性名
留神:要更新的字段必须是 volatile 类型的

样例如下:

private static AtomicIntegerFieldUpdater<User> a = AtomicIntegerFieldUpdater.newUpdater(User.class, "age");
public static class User{
    private String name;
    public volatile int age;
}
退出移动版