挥发性和原子性在一起它有意义吗?

时间:2014-05-05 11:11:25

标签: java concurrency synchronization atomic volatile

我注意到所有关于没有volatile关键字的原子写入的例子。当然是对的。

如果我将volatile修饰符添加到原子链接会发生什么?

之间是否存在差异:

public class VolatilAtomic {
    volatile AtomicInteger atomicInteger = new AtomicInteger();
}

 public class VolatilAtomic {
         AtomicInteger atomicInteger = new AtomicInteger();
    }

3 个答案:

答案 0 :(得分:4)

如果在方法中重新分配变量atomicInteger = new AtomicInteger()会有所不同,在这种情况下,将变量标记为volatile将保证其他线程可以看到赋值。

但是,如果您只使用为您的每个类实例创建的AtomicInteger实例,并且从不重新分配它,则volatile是不必要的。

答案 1 :(得分:4)

一般来说,final会更合适。

关于修饰符的重要之处在于改变引用,而不是引用的对象。 e.g。

final int[] a = { 0 };
a[0] = 5;    // ok, not final
a = b;       // not ok as it is final 

类似地

volatile int[] a = { 0 };
a[0] = 5;    // not a volatile write
a = b;       // volatile write.

答案 2 :(得分:0)

两者都提供相同的可见性,但只有AtomicInteger提供原子性