用於對指定類的 volatile long 類型成員字段進行原子更新,基於反射實現。
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):延遲設置// 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; }
}
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 指令直接操作字段內存偏移量,保證原子性。