我注意到所有关于没有volatile
关键字的原子写入的例子。当然是对的。
如果我将volatile修饰符添加到原子链接会发生什么?
之间是否存在差异:
public class VolatilAtomic {
volatile AtomicInteger atomicInteger = new AtomicInteger();
}
和
public class VolatilAtomic {
AtomicInteger atomicInteger = new AtomicInteger();
}
答案 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提供原子性。