回覆列表
-
1 # 技術之芯
-
2 # 勿與君子鬥名
原子引用保證同一時間只能獲取一個控制代碼,當控制代碼被佔用,其它申請操作將阻塞。其字首“Atomic”其實是強調控制代碼的申請和分配是原子安全且高效的,高效是因為底層使用(正常情況下)原子指令來完成控制代碼的鎖定操作,而非互斥體(Mutex)。原子操作是特定CPU指令支援,不需要作業系統分配核心資源,所以極其高效。
原子引用保證同一時間只能獲取一個控制代碼,當控制代碼被佔用,其它申請操作將阻塞。其字首“Atomic”其實是強調控制代碼的申請和分配是原子安全且高效的,高效是因為底層使用(正常情況下)原子指令來完成控制代碼的鎖定操作,而非互斥體(Mutex)。原子操作是特定CPU指令支援,不需要作業系統分配核心資源,所以極其高效。
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) 指令。當前絕大多數處理器都已經實現了這個指令,所以原子更新是需要底層處理器指令支援的。