AtomicReference

An object reference that may be updated atomically.

The AtomicReference class provides reference objects that may be read and written atomically, so when multiple threads try to reach them at the same time, only one will be able to do so.
提供了引用变量的读写原子性操作。

提供了如下的方法:

  • compareAndSet(V expect, V update):Atomically sets the value to the given updated value if the current value == the expected value.
  • getAndSet(V newValue):Atomically sets to the given value and returns the old value.
  • lazySet(V newValue):Eventually sets to the given value.
  • set(V newValue):Sets to the given value.
  • get():Gets the current value.

假设有一个类 Person,定义如下:

Java 原子性引用: AtomicReference_引用变量

Java 原子性引用: AtomicReference_多线程_02

如果使用普通的对象引用,在多线程情况下进行对象的更新可能会导致不一致性。例如:
一个对象的初始状态为 name=Tom, age = 18
在 线程1 中将 name 修改为 Tom1age + 1
在 线程2 中将 name 修改为 Tom2age + 2

我们认为只会产生两种结果:

  • 若 线程1 先执行,线程2 后执行,则中间状态为 name=Tom1, age = 19,结果状态为 name=Tom2, age = 21
  • 若 线程2 先执行,线程1 后执行,则中间状态为 name=Tom2, age = 20,结果状态为 name=Tom1, age = 21

但是可能的输出如下:

Person is [name: Tom, age: 18]
Thread2 Values [name: Tom1, age: 21]
Thread1 Values [name: Tom1, age: 21]
Now Person is [name: Tom1, age: 21]

Java 原子性引用: AtomicReference_对象引用_03

Java 原子性引用: AtomicReference_引用变量_04

如果使用原子性对象引用,在多线程情况下进行对象的更新可以确保一致性。例如:

Java 原子性引用: AtomicReference_引用变量_05

Java 原子性引用: AtomicReference_引用变量_06

但是可能的输出如下:

Atomic Person is [name: Tom, age: 18]
Thread1 Atomic References [name: Tom1, age: 19]
Thread2 Atomic References [name: Tom2, age: 21]
Now Atomic Person is [name: Tom2, age: 21]