【问题标题】:Make an AtomicXXX object volatile使 AtomicXXX 对象易失
【发布时间】:2011-11-11 09:39:31
【问题描述】:

我已经阅读了一些关于 volatile 变量及其 AtomicXXX 对应物的信息(例如 AtomicBoolean)。

但在某些情况下,我需要使 AtomicXXX 对象本身易失,还是根本不需要?

【问题讨论】:

    标签: java concurrency atomic


    【解决方案1】:

    你不需要——事实上,原子对象真的应该设置为final!!

    例子:

    private final AtomicInteger atomicInt = new AtomicInteger(0);
    
    private volatile int volatileInt = 0;
    
    public void doStuff() {
      // To use the atomic int, you use the setters and getters!
      int gotAnInt = atomicInt.getAndIncrement();
    
      // To use a volatile, access and set it directly. 
      int gotAnotherInt = volatileInt;
      volatileInt = someOtherInt;
    }
    

    【讨论】:

    • 第二个 volatileInt (volatileInt = someOtherInt;) 赋值不包括读和写,从而使操作不是原子的吗?
    • 是的,这是真的。抱歉暗示其他 - 我将删除对原子性的引用! (仅供参考,赋值本身是原子的,但读取然后写入不是原子的)
    • 所以我应该同步 doStuff() 方法以使其全部原子化?切入正题:那么如果AtomicXXX没有被声明为final,如果是不同线程之间共享的话,理论上我应该声明为volatile?
    • 不 - AtomicInteger 类的内部为您处理同步。您不需要将其设为 volatile(事实上,最终的 volatile 变量没有任何意义!)
    【解决方案2】:

    阅读this 了解何时使用 volatile 的一些提示和说明。但基本上,如果您使用的是 AtomicXXX,则不需要使用 volatile。

    【讨论】:

      猜你喜欢
      • 2014-04-09
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 2015-04-23
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      相关资源
      最近更新 更多