1. 程式人生 > >java.util.concurrent.atomic 類包詳解

java.util.concurrent.atomic 類包詳解

java.util.concurrent包分成了三個部分,分別是java.util.concurrentjava.util.concurrent.atomic和java.util.concurrent.lock。內容涵蓋了併發集合類、執行緒池機制、同步互斥機制、執行緒安全的變數更新工具類、鎖等等常用工具。

AtomicInteger:

AtomicReference<V>

API文件介紹:

軟體包 java.util.concurrent.atomic 的描述

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

  boolean compareAndSet(expectedValue, updateValue);

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

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

AtomicBoolean

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

class Sequencer {
  private final AtomicLong sequenceNumber
    = new AtomicLong(0);
  public long next() {
    return sequenceNumber.getAndIncrement();
  }
}
  • get 具有讀取 volatile 變數的記憶體效果。
  • set 具有寫入(分配)volatile 變數的記憶體效果。
  • 除了允許使用後續(但不是以前的)記憶體操作,其自身不施加帶有普通的非 volatile 寫入的重新排序約束,lazySet 具有寫入(分配)volatile 變數的記憶體效果。在其他使用上下文中,當為 null 時(為了垃圾回收),lazySet 可以應用不會再次訪問的引用。
  • weakCompareAndSet 以原子方式讀取和有條件地寫入變數但 建立任何 happen-before 排序,因此不提供與除 weakCompareAndSet 目標外任何變數以前或後續讀取或寫入操作有關的任何保證。
  • compareAndSet 和所有其他的讀取和更新操作(如 getAndIncrement)都有讀取和寫入 volatile 變數的記憶體效果。

除了包含表示單個值的類之外,此包還包含 Updater 類,該類可用於獲取任意選定類的任意選定 volatile 欄位上的 compareAndSet 操作。AtomicReferenceFieldUpdaterAtomicIntegerFieldUpdater AtomicLongFieldUpdater 是基於反射的實用工具,可以提供對關聯欄位型別的訪問。它們主要用於原子資料結構中,該結構中同一節點(例如,樹節點的連結)的幾個 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 

相關推薦

java.util.concurrent.atomic

java.util.concurrent包分成了三個部分,分別是java.util.concurrent、java.util.concurrent.atomic和java.util.concurrent.lock。內容涵蓋了併發集合類、執行緒池機制、同步互斥機制、執行緒安全

Java學習筆記—多線程(原子java.util.concurrent.atomic,轉載)

支持 位置 dset 賦值 嵌入 imp ans 匯編指令 sta 原子類 Java從JDK 1.5開始提供了java.util.concurrent.atomic包(以下簡稱Atomic包),這個包中 的原子操作類提供了一種用法簡單、性能高效、線程安全地更新一個變量的方

Java學習筆記—多線程(並發工具java.util.concurrent.atomic

配對 初始 訪問 接收 iter nco .get 執行 string 在JDK的並發包裏提供了幾個非常有用的並發工具類。CountDownLatch、CyclicBarrier和Semaphore工具類提供了一種並發流程控制的手段,Exchanger工具類則提供了在線程間

JDK1.8的Java.util.concurrent.atomic小結

Atomic意為原子的,JUC包又是併發包,所以不必多說。 Atomic的特點 ①多執行緒環境下,無所的進行原子操作。 ②不能絕對保證執行緒不被阻塞。(因不同CPU的原子指令不同,可能需要某種形式的內部鎖) Atomic下有哪些類 13個實現類

Java對象和

htc db2 ucs docs em1 mvp ini ndt ecs 琴7A0坎4純3硬si藕菜時http://docstore.docin.com/xpyd645 膊9強4埔cs黑依oehttp://www.docin.com/nir7778 R7E20wm8

java.util.concurrent CyclicBarrier

實現 .cn tint style pub interrupt com err rup CyclicBarrier類:   原文:一個同步輔助類,它允許一組線程互相等待,直到到達某個公共屏障點 (common barrier point)。在涉及一組固定大小的線程的程序中,

java.util.concurrent.TimeUtil

TimeUnit是java.util.concurrent包下面的一個列舉類,TimeUnit提供了可讀性更好的執行緒暫停操作、不同時間之間的轉換操作。 NANOSECONDS (毫微秒, 千分之一微秒) public static final TimeUnit NANOSECONDS MI

java.util.concurrent.Executors的常用方法介紹

Java 執行緒池 Executors提供了幾種執行緒池實現? 5個,分別如下 1、newCachedThreadPool:建立一個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活回收空閒執行緒,若無可回收,則新建執行緒。(執行緒最大併發數不可控制)2、newFixedThreadPool:建立一個

Java利器之UML

前言 UML(Unified Modeling Language)中文統一建模語言,是一種開放的方法,用於說明、視覺化、構建和編寫一個正在開發的、面向物件的、軟體密集系統的製品的開放方法。UML展現了一系列最佳工程實踐,這些最佳實踐在對大規模,複雜系統進

(二)java生成隨機數工具RandomUtils

/** * 生成一個隨機的布林值 */ boolean flag = RandomUtils.nextBoolean();

(一)JAVA生成隨機數工具RandomStringUtils

public static String random(int count, boolean letters, boolean numbers) /**

多執行緒-Java原子變數-java.util.concurrent.atomic.*

一個沒有併發控制的計數器: publicclass Counter implements Runnable {       privatestaticint count;       publicvoid run() {           System.out.

java.util.concurrent 併發工具(二)

一、ThreadPoolExecutor 執行緒池執行者 初始化執行緒池的引數 corePoolSize 核心執行緒大小 maximumPoolSize 最大執行緒大小 keepAliveTime 空餘的多餘執行緒保持時間 unit 時間

Java中的Arrays使用

首先先建立一個列印陣列的方法,方便後面直接使用 public static void output(int []a) { for(int i=0;i<a.length;i++) { System.out.pri

Java學習札記12:Java中的StringBuilder功能

字串是 Java 程式中最常用的一種資料結構之一。在 Java 中的 String 類已經過載的"+"。也就是說,字串可以直接使用"+"進行連線,如下面程式碼所示: String s = "abc" + "ddd"; 但這樣做真的好嗎?當然,這個問題不能簡單地回答 Yes

【一】關於java.util.concurrent下的併發atomic

併發類包除了java.util.concurrent之外,還有java.util.concurrent.atomic和java.util.concurrent.lock.java.util.concurrent中主要是一些關於集合框架的併發實現,例如ConcurrentHas

java.util(二)——Connection接口

操作 相同 元素 叠代 cat roo soft true nbsp Connection接口介紹   Connection接口是java集合的root接口,沒有實現類,只有子接口和實現子接口的各種容器。主要用來表示java集合這一大的抽象概念。   Connection接

Java基礎知識-java.util.concurrent下常見的使用

finall iss con value 通信 out 否則 app ted 一,Condition 一個場景,兩個線程數數,同時啟動兩個線程,線程A數1、2、3,然後線程B數4、5、6,最後線程A數7、8、9,程序結束,這涉及到線程之間的通信。 public class

jdk1.8 java.util.stream.Stream

-c 打印 而不是 oid ole 表達 ice java-8 java 8 為什麽需要 Stream Stream 作為 Java 8 的一大亮點,它與 java.io 包裏的 InputStream 和 OutputStream 是完全不同的概念。它也不同於 StAX

java.util.concurrent 下面的所有

java.util.concurrent 包下面的所有類 原子運算元類: java.util.concurrent.atomic.AtomicBoolean.class java.util.concurrent.atomic.AtomicInteger.class java.ut