AtomicReference如何保證對象在共享變量的原子操作?
AtomicReference 屬于 Java 并發包下面的一個原子操作類,其可以原子更新引用類型。示例代碼如下所示:
AtomicReference<User> atomicUserRef = new AtomicReference<User>();
User user = new User("Tom");
atomicUserRef.set(user);
User updateUser = new User("Lili");
// 原子更新引用類型
atomicUserRef.compareAndSet(user, updateUser);
AtomicReference 在多線程環境下,能夠做到原子更新引用類型主要由以下兩個原因:
一、在 AtomicReference 內部定義了一個 volatile 類型的引用,用于存儲當前引用類型:
private volatile V value;
volatile 能夠保證 A 線程更新了 value 值后,B 線程能即時看到。即可見性。
二、compareAndSet 借助的是 unsafe 類進行更新的:
public final boolean compareAndSet(V expect, V update) {
return unsafe.compareAndSwapObject(this, valueOffset, expect, update);
}
Unsafe 類最終調用的是 C++ 方法,C++ 最終調用的是處理器提供的用于原子更新的 CAS (Compare And Swap) 指令。當前絕大多數處理器都已經實現了這個指令,所以原子更新是需要底層處理器指令支持的。