簡體   English   中英

同步的揮發性布爾值等於atomicBoolean嗎?

[英]Is synchronized volatile boolean equal to atomicBoolean?

當我們僅對變量執行讀操作時,應使用易失性,因為一個線程更新的值將對另一線程可見,即使前一個線程失去了CPU並退出了同步塊。 那是對的嗎? 當需要使用原子行為時,將使用原子原語。 例如 -

if (volatileBoolean) {
    volatileBoolean = !volatileBoolean;
}

假設volatileBoolean的值為true。 一個線程將volatileBoolean檢查為true並輸入是否為block,第二個線程將volatileBoolean的值視為true,也輸入if塊。 現在,讓我們假設第一個線程為volatileBoolean變量分配了錯誤的值(!volatileBoolean)並釋放了CPU,因此退出了if塊。 第二個線程將volatileBoolean視為false,然后將其分配回true。

是否應該使用AtomicBoolean? 如果是,為什么不能通過使用同步來解決?

synchronized(this){
        if (volatileBoolean) {
            volatileBoolean = !volatileBoolean;
        }
}

是否應該使用AtomicBoolean?

是的。

如果是,為什么不能通過使用同步來解決?

它在功能上是等效的,但AtomicBoolean不使用鎖,在中等競爭下它可以更有效。 看到另一個問題 -查看AtomicInteger,但結論也直接適用於AromicBoolean。

是的,這是您要使用AtomicBoolean的情況。 這是實現您提到的那種同步(而不是自己完成)的一種非常好又安全的方法,並且速度更快。 另請參閱此鏈接 ,以與使用volatile布爾值進行比較進行比較。

當我們僅對變量執行讀操作時,應使用易失性,因為一個線程更新的值將對另一線程可見,即使前一個線程失去了CPU並退出了同步塊。 那是對的嗎?

  • volatile與同步塊沒有任何依賴性。 volatile變量不由線程緩存。 因此,一個線程的更改將對其他線程可見。
  • 因此,當通過單個線程完成對變量的寫入/更新時,可以使用易失性變量,並且更新需要立即對訪問該變量的所有其他線程可見。 volatile僅確保可見性,而不確保原子性。

是否應該使用AtomicBoolean? 如果是,為什么不能通過使用同步來解決?

  • 是的,如果您使用同步塊,則不需要在內部使用volatile變量,因為同步塊將確保共享數據的可見性和原子性。 在大多數當前處理器體系結構上,易失性讀取要比非易失性讀取貴一些。

關於AtomicBoolean

AtomicBoolean在內部使用volatile int和CAS操作來提供可見性和原子性。

AtomicBoolean.java

public class AtomicBoolean implements java.io.Serializable {

  private volatile int value;

   /**
    * Creates a new {@code AtomicBoolean} with the given initial value.
    *
    * @param initialValue the initial value
    */
   public AtomicBoolean(boolean initialValue) {
       value = initialValue ? 1 : 0;
   }

摘自Java Concurrency In Practice一書,關於易失性變量。

Java語言還提供了另一種較弱的同步形式的可變變量,以確保對變量的更新可預測地傳播到其他線程。 當某個字段聲明為volatile時,將通知編譯器和運行時該變量是共享的,並且對該變量的操作不應與其他內存操作重新排序。 僅在可變變量簡化實現和驗證同步策略時才使用它們; 避免在驗證正確性時需要使用易失性變量,這需要對可見性進行微妙的推理。 充分利用易失性變量包括確保其自身狀態,它們所引用的對象的可見性,或指示發生了重要的生命周期事件(例如初始化或關閉)。

AtomicBoolean和任何AtomicSomething都是使用volatile實現的。 唯一的區別是,這些AtomicSomething包含一些無需同步關鍵字即可進行同步的方法,例如compareAndSet或lazySet。 因此,您可能應該在這種情況下使用AtomicBoolean。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM