JavaTM 2 Platform
Standard Ed. 6

軟體套件 java.util.concurrent.atomic

類別的小工具套件,支持在單個變數上解除鎖的執行緒安全程式。

請參見:
          描述

類別摘要
AtomicBoolean 可以用原子方式更新的 boolean 值。
AtomicInteger 可以用原子方式更新的 int 值。
AtomicIntegerArray 可以用原子方式更新其元素的 int 陣列。
AtomicIntegerFieldUpdater<T> 基於反射的實用工具,可以對指定類別的指定 volatile int 欄位進行原子更新。
AtomicLong 可以用原子方式更新的 long 值。
AtomicLongArray 可以用原子方式更新其元素的 long 陣列。
AtomicLongFieldUpdater<T> 基於反射的實用工具,可以對指定類別的指定 volatile long 欄位進行原子更新。
AtomicMarkableReference<V> AtomicMarkableReference 維護帶有標記位的物件參考,可以原子方式對其進行更新。
AtomicReference<V> 可以用原子方式更新的物件參考。
AtomicReferenceArray<E> 可以用原子方式更新其元素的物件參考陣列。
AtomicReferenceFieldUpdater<T,V> 基於反射的實用工具,可以對指定類別的指定 volatile 欄位進行原子更新。
AtomicStampedReference<V> AtomicStampedReference 維護帶有整數「標誌」的物件參考,可以用原子方式對其進行更新。
 

軟體套件 java.util.concurrent.atomic 的描述

類別的小工具套件,支持在單個變數上解除鎖的執行緒安全程式。事實上,此套件中的類別可將 volatile 值、欄位和陣列元素的概念擴展到那些也提供原子條件更新操作的類別,其形式如下:

  boolean compareAndSet(expectedValue, updateValue);

如果此方法(在不同的類別間參數型別也不同)當前保持 expectedValue,則以原子方式將變數設置為 updateValue,並在成功時報告 true。此套件中的類別還包含獲取並無條件設置值的方法,以及以下描述的較弱條件的原子更新操作 weakCompareAndSet

這些方法的規範使實作能夠使用當代處理器上提供的高效機器級別原子指令。但是在某些平臺上,該支持可能需要某種形式的內部鎖。因而,該方法不能嚴格保證不被阻塞 - 執行操作之前可能暫時阻塞執行緒。

類別 AtomicBooleanAtomicIntegerAtomicLongAtomicReference 的實例各自提供對相應型別單個變數的存取和更新。每個類別也為該型別提供適當的實用工具方法。例如,類別 AtomicLongAtomicInteger 提供了原子增量方法。一個應用程序將按以下方式產生序列號:

class Sequencer {
  private final AtomicLong sequenceNumber
    = new AtomicLong(0);
  public long next() {
    return sequenceNumber.getAndIncrement();
  }
}

原子存取和更新的記憶體效果一般遵循以下可變規則,正如 The Java Language Specification, Third Edition (17.4 Memory Model) 中的宣告:

除了包含表示單個值的類別之外,此套件還包含 Updater 類別,該類別可用於獲取任意選定類別的任意選定 volatile 欄位上的 compareAndSet 操作。AtomicReferenceFieldUpdaterAtomicIntegerFieldUpdaterAtomicLongFieldUpdater 是基於反射的實用工具,可以提供對關聯欄位型別的存取。它們主要用於原子資料結構中,該結構中同一節點(例如,階層樹節點的連接)的幾個 volatile 欄位都獨立受原子更新控制。這些類別在如何以及何時使用原子更新方面具有更大的靈活性,但相應的弊端是基於映射的設置較為拙笨、使用不太方便,而且在保證方面也較差。

AtomicIntegerArrayAtomicLongArrayAtomicReferenceArray 類別進一步擴展了原子操作,對這些型別的陣列提供了支持。這些類別在為其陣列元素提供 volatile 存取語義方面也引人注目,這對於普通陣列來說是不受支持的。

原子類別也支持 weakCompareAndSet 方法,該方法具有受限制的適用性。在某些平臺上,弱版本在正常情況下可能比 compareAndSet 更有效,但不同的是 weakCompareAndSet 方法的任何給定調用可能意外 返回 false(即沒有明確的原因)。返回 false 僅意味著可以在需要時重新嘗試操作,具體取決於重複執行調用的保證,當該變數保持 expectedValue 並且沒有其他執行緒也在嘗試設置該變數時,最終將獲得成功。(例如,這樣的虛假失敗可能是由於記憶體爭用的結果,該爭用與期望值和當前值是否相等無關)。 此外,weakCompareAndSet 不提供通常需要同步控制的排序保證。但是,在這樣的更新與程序的其他 happen-before 排序不相關時,該方法可用於更新計數器和統計資料。當一個執行緒看到對 weakCompareAndSet 導致的原子變數的更新時,它不一定能看到在 weakCompareAndSet 之前發生的對任何其他 變數的更新。例如,在更新性能統計資料時,這也許可以接受,但其他情況幾乎不可以。

AtomicMarkableReference 類別將單個布林值與參考關聯起來。例如,可以在資料結構內部使用此位,這意味著參考的物件在邏輯上已被刪除。AtomicStampedReference 類別將整數值與參考關聯起來。例如,這可用於表示與更新系列對應的版本號。

設計原子類別主要用作各種建構塊,用於實作非阻塞資料結構和相關的基礎結構類別。compareAndSet 方法不是鎖的常規替換方法。僅當物件的重要更新限定於單個 變數時才應用它。

原子類別不是 java.lang.Integer 和相關類別的通用替換方法。它們 定義諸如 hashCodecompareTo 之類別的方法。(因為原子變數是可變的,所以對於雜湊表鍵來說,它們不是好的選擇。)另外,僅為那些通常在預期應用程序中使用的型別提供類別。例如,沒有表示 byte 的原子類別。這種情況不常見,如果要這樣做,可以使用 AtomicInteger 來保持 byte 值,並進行適當的強制轉換。也可以使用 Float.floatToIntBitsFloat.intBitstoFloat 轉換來保持 float 值,使用 Double.doubleToLongBitsDouble.longBitsToDouble 轉換來保持 double 值。

從以下版本開始:
1.5

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

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