首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java JUC 原子類:AtomicLongFieldUpdater 原子更新字段實戰

     編輯:Java 相關知識

1. AtomicLongFieldUpdater 簡介

用於對指定類的 volatile long 類型成員字段進行原子更新,基於反射實現。

2. 核心方法列表

  • static AtomicLongFieldUpdater newUpdater(Class tclass, String fieldName):創建更新器
  • boolean compareAndSet(T obj, long expect, long update):CAS 更新
  • long getAndSet(T obj, long newValue):原子設置並返回舊值
  • long getAndIncrement(T obj)、long incrementAndGet(T obj) 等增減操作
  • void lazySet(T obj, long newValue):延遲設置

3. 實戰示例

// LongFieldTest.java
import java.util.concurrent.atomic.AtomicLongFieldUpdater;
public class LongFieldTest {
    public static void main(String[] args) {
        Class cls = Person.class;
        AtomicLongFieldUpdater mAtoLong = AtomicLongFieldUpdater.newUpdater(cls, "id");
        Person person = new Person(12345678L);
        // 若 id 為 12345678L,則設置為 1000
        mAtoLong.compareAndSet(person, 12345678L, 1000);
        System.out.println("id=" + person.getId()); // 輸出 id=1000
    }
}
class Person {
    volatile long id; // 必須 volatile
    public Person(long id) { this.id = id; }
    public long getId() { return id; }
}

4. 源碼核心解析(JDK 1.7.0_40)

newUpdater() 根據 JVM 是否支持 long 類型 CAS,返回 CASUpdater 或 LockedUpdater。以 CASUpdater 為例:

public boolean compareAndSet(T obj, long expect, long update) {
    if (obj == null || obj.getClass() != tclass || cclass != null) fullCheck(obj);
    return unsafe.compareAndSwapLong(obj, offset, expect, update);
}

通過 Unsafe 的 CAS 指令直接操作字段內存偏移量,保證原子性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved