我注意到所有关于原子写的例子都没有volatile
关键字。当然是对的。
如果我在原子链接中添加volatile修饰符会发生什么?
public class VolatilAtomic {
volatile AtomicInteger atomicInteger = new AtomicInteger();
}
和
public class VolatilAtomic {
AtomicInteger atomicInteger = new AtomicInteger();
}
?
如果您在方法中重新分配变量:atomicInteger = new AtomicInteger()
,则会有所不同,在这种情况下,将变量标记为volatile
将保证其他线程可以看到该赋值。
但是,如果您只使用与您的类的每个实例创建的AtomicInteger
实例,并且从不重新分配它,那么volatile
是不必要的。
一般来说,final
会更合适。
修饰符的重要之处在于它改变的是引用,而不是被引用的对象。例如
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.
两者都提供相同的可见性,但只有AtomicInteger提供原子性。