回覆列表
  • 1 # 技術之芯

    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) 指令。當前絕大多數處理器都已經實現了這個指令,所以原子更新是需要底層處理器指令支援的。

  • 2 # 勿與君子鬥名

    原子引用保證同一時間只能獲取一個控制代碼,當控制代碼被佔用,其它申請操作將阻塞。其字首“Atomic”其實是強調控制代碼的申請和分配是原子安全且高效的,高效是因為底層使用(正常情況下)原子指令來完成控制代碼的鎖定操作,而非互斥體(Mutex)。原子操作是特定CPU指令支援,不需要作業系統分配核心資源,所以極其高效。

  • 中秋節和大豐收的關聯?
  • 汽車後面剎車燈一直亮是什麼原因?