[英]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並退出了同步塊。 那是對的嗎?
是否應該使用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語言還提供了另一種較弱的同步形式的可變變量,以確保對變量的更新可預測地傳播到其他線程。 當某個字段聲明為volatile時,將通知編譯器和運行時該變量是共享的,並且對該變量的操作不應與其他內存操作重新排序。 僅在可變變量簡化實現和驗證同步策略時才使用它們; 避免在驗證正確性時需要使用易失性變量,這需要對可見性進行微妙的推理。 充分利用易失性變量包括確保其自身狀態,它們所引用的對象的可見性,或指示發生了重要的生命周期事件(例如初始化或關閉)。
AtomicBoolean和任何AtomicSomething都是使用volatile實現的。 唯一的區別是,這些AtomicSomething包含一些無需同步關鍵字即可進行同步的方法,例如compareAndSet或lazySet。 因此,您可能應該在這種情況下使用AtomicBoolean。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.