繁体   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