JavaTM 2 Platform
Standard Ed. 6

java.util.concurrent.atomic
類別 AtomicReferenceFieldUpdater<T,V>

java.lang.Object
  繼承者 java.util.concurrent.atomic.AtomicReferenceFieldUpdater<T,V>
型別參數:
T - 保持可更新欄位的物件的型別
V - 欄位的型別

public abstract class AtomicReferenceFieldUpdater<T,V>
extends Object

基於反射的實用工具,可以對指定類別的指定 volatile 欄位進行原子更新。該類別用於原子資料結構,該結構中同一節點的幾個參考欄位都獨立受原子更新控制。例如,階層樹節點可能宣告為

 class Node {
   private volatile Node left, right;

   private static final AtomicReferenceFieldUpdater leftUpdater =
     AtomicReferenceFieldUpdater.newUpdater(Node.class, Node.class, "left");
   private static AtomicReferenceFieldUpdater rightUpdater =
     AtomicReferenceFieldUpdater.newUpdater(Node.class, Node.class, "right");

   Node getLeft() { return left;  }
   boolean compareAndSetLeft(Node expect, Node update) {
     return leftUpdater.compareAndSet(this, expect, update);
   }
   // ... and so on
 }
 

注意,此類別中 compareAndSet 方法的保證弱於其他原子類別中該方法的保證。因為此類別不能確保所有使用的欄位都適合於原子存取目的,所以,對於 compareAndSetset 的其他調用,它僅可以保證原子性和可變語義。

從以下版本開始:
1.5

建構子摘要
protected AtomicReferenceFieldUpdater()
          受保護的無操作建構子,供子類別使用。
 
方法摘要
abstract  boolean compareAndSet(T obj, V expect, V update)
          如果當前值 == 預期值,則以原子方式將此更新器管理的給定物件的欄位設置為給定的更新值。
abstract  V get(T obj)
          獲取由此更新器管理的在給定物件的欄位中保持的當前值。
 V getAndSet(T obj, V newValue)
          將此更新器管理的給定物件的欄位自動設置為給定值,並返回舊值。
abstract  void lazySet(T obj, V newValue)
          最終將此更新器管理的給定物件的欄位設置為給定更新值。
static
<U,W> AtomicReferenceFieldUpdater<U,W>
newUpdater(Class<U> tclass, Class<W> vclass, String fieldName)
          使用給定的欄位為物件創建和返回一個更新器。
abstract  void set(T obj, V newValue)
          將此更新器管理的給定物件的欄位設置為給定更新值。
abstract  boolean weakCompareAndSet(T obj, V expect, V update)
          如果當前值 == 預期值,則以原子方式將此更新器管理的給定物件的欄位設置為給定的更新值。
 
從類別 java.lang.Object 繼承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

建構子詳細資訊

AtomicReferenceFieldUpdater

protected AtomicReferenceFieldUpdater()
受保護的無操作建構子,供子類別使用。

方法詳細資訊

newUpdater

public static <U,W> AtomicReferenceFieldUpdater<U,W> newUpdater(Class<U> tclass,
                                                                Class<W> vclass,
                                                                String fieldName)
使用給定的欄位為物件創建和返回一個更新器。需要 Class 參數檢查反射型別和一般型別是否比對。

參數:
tclass - 保持欄位的物件類別。
vclass - 該欄位的類別
fieldName - 要更新的欄位名稱。
返回:
更新器
拋出:
IllegalArgumentException - 如果該欄位不是可變參考型別。
RuntimeException - 如果該類別不保持欄位,或者是錯誤的型別,將拋出 RuntimeException 和一個巢狀的基於反射的異常。

compareAndSet

public abstract boolean compareAndSet(T obj,
                                      V expect,
                                      V update)
如果當前值 == 預期值,則以原子方式將此更新器管理的給定物件的欄位設置為給定的更新值。對 compareAndSetset 的其他調用,此方法可以確保原子性,但對於欄位中的其他更改則不一定確保原子性。

參數:
obj - 有條件地設置其欄位的物件
expect - 預期值
update - 新值
返回:
如果成功,則返回 true。

weakCompareAndSet

public abstract boolean weakCompareAndSet(T obj,
                                          V expect,
                                          V update)
如果當前值 == 預期值,則以原子方式將此更新器管理的給定物件的欄位設置為給定的更新值。對 compareAndSetset 的其他調用,此方法可以確保原子性,但對於欄位中的其他更改則不一定確保原子性。

可能意外失敗並且不提供排序保證,所以只有在很少的情況下才對 compareAndSet 進行適當地選擇。

參數:
obj - 有條件地設置其欄位的物件
expect - 預期值
update - 新值
返回:
如果成功,則返回 true。

set

public abstract void set(T obj,
                         V newValue)
將此更新器管理的給定物件的欄位設置為給定更新值。對於 compareAndSet 的後續調用,此操作可以確保充當可變存儲。

參數:
obj - 要設置其欄位的物件
newValue - 新值

lazySet

public abstract void lazySet(T obj,
                             V newValue)
最終將此更新器管理的給定物件的欄位設置為給定更新值。

參數:
obj - 要設置其欄位的物件
newValue - 新值
從以下版本開始:
1.6

get

public abstract V get(T obj)
獲取由此更新器管理的在給定物件的欄位中保持的當前值。

參數:
obj - 要獲取其欄位的物件
返回:
當前值

getAndSet

public V getAndSet(T obj,
                   V newValue)
將此更新器管理的給定物件的欄位自動設置為給定值,並返回舊值。

參數:
obj - 要獲取並設置其欄位的物件
newValue - 新值
返回:
以前的值

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only