java.util.concurrent.atomic

java.util.concurrent.atomic

軟體包 java.util.concurrent.atomic 是類的小工具包,支持在單個變數上解除鎖定的執行緒安全編程。事實上,此包中的類可將 volatile 值、欄位和數組元素的概念擴展到那些也提供原子條件更新操作的類,其形式如下: boolean compareAndSet(expectedValue, updateValue);。

基本介紹

  • 中文名:java.util.concurrent.atomic
  • 屬性:小工具包
  • 支持:支持解除鎖定的執行緒安全編程
  • 類型軟體包
方法介紹,可變規則,原子模組,

方法介紹

如果此方法(在不同的類間參數類型也不同)當前保持 expectedValue,則以原子方式將變數設定為 updateValue,並在成功時報告 true。此包中的類還包含獲取並無條件設定值的方法,以及較弱條件的原子更新操作 weakCompareAndSet。該弱版本操作在正常情況下可能更有效,但不同的是weakCompareAndSet 方法的任何給定調用可能會失敗,甚至意外失敗(即沒有明確的原因)。返回 false 僅意味著可以在需要時重新嘗試操作,具體取決於重複執行調用的保證,當該變數保持 expectedValue 並且沒有其他執行緒也在嘗試設定該變數時,調用最終將獲得成功。
這些方法的規範使實現能夠使用當代處理器上提供的高效機器級別原子指令。但是在某些平台上,該支持可能需要某種形式的內部鎖定。因而,該方法不能嚴格保證不被阻塞 - 執行操作之前可能暫時阻塞執行緒。
類 AtomicBoolean、AtomicInteger、AtomicLong 和 AtomicReference 的實例各自提供對相應類型單個變數的訪問和更新。每個類也為該類型提供適當的實用工具方法。例如,類 AtomicLong 和 AtomicInteger 提供了原子增量方法。一個應用程式將按以下方式生成序列號:
class Sequencer {
private AtomicLong sequenceNumber = new AtomicLong(0);
public long next() { return sequenceNumber.getAndIncrement(); }
}

可變規則

原子訪問和更新的記憶體效果一般遵循以下可變規則:
get 具有讀取 volatile 變數的記憶體效果。
set 具有寫入(分配) volatile 變數的記憶體效果。
weakCompareAndSet 以原子方式讀取和有條件地寫入變數,並對於該變數上的其他記憶體操作進行排序,否則將充當普通的非可變記憶體操作。
compareAndSet 和所有其他的讀取和更新操作(如 getAndIncrement)都有讀取和寫入 volatile 變數的記憶體效果。
除了包含表示單個值的類之外,此包還包含 Updater 類,該類可用於獲取任意選定類的任意選定 volatile 欄位上的 compareAndSet 操作。AtomicReferenceFieldUpdater、AtomicIntegerFieldUpdater 和 AtomicLongFieldUpdater 是基於反射的實用工具,可以提供對關聯欄位類型的訪問。它們主要用於原子數據結構中,該結構中同一節點(例如,樹節點的連結)的幾個 volatile 欄位都獨立受原子更新控制。這些類在如何以及何時使用原子更新方面具有更大的靈活性,但相應的弊端是基於映射的設定較為拙笨、使用不太方便,而且在保證方面也較差。
AtomicIntegerArray、AtomicLongArray 和 AtomicReferenceArray 類進一步擴展了原子操作,對這些類型的數組提供了支持。這些類在為其數組元素提供 volatile 訪問語義方面也引人注目,這對於普通數組來說是不受支持的。
AtomicMarkableReference 類將單個布爾值與引用關聯起來。例如,可以在數據結構內部使用此位,這意味著引用的對象在邏輯上已被刪除。AtomicStampedReference 類將整數值與引用關聯起來。例如,這可用於表示與更新系列對應的版本號。

原子模組

設計原子類主要用作各種構造塊,用於實現非阻塞數據結構和相關的基礎結構類。compareAndSet 方法不是鎖定的常規替換方法。僅當對象的重要更新限定於單個 變數時才套用它。
原子類不是 java.lang.Integer 和相關類的通用替換方法。它們不定義諸如 hashCode 和 compareTo 之類的方法。(因為原子變數是可變的,所以對於哈希表鍵來說,它們不是好的選擇。)另外,僅為那些通常在預期應用程式中使用的類型提供類。例如,沒有表示 byte 的原子類。這種情況不常見,如果要這樣做,可以使用 AtomicInteger 來保持 byte 值,並進行適當的強制轉換。也可以使用 Float.floatToIntBits 和 Float.intBitstoFloat 轉換來保持 float 值,使用 Double.doubleToLongBits 和 Double.longBitsToDouble 轉換來保持 double 值。
從以下版本開始:
1.5

相關詞條

熱門詞條

聯絡我們