JUC 的原子操作类AtomicReference & 与volatile的区别

volatile

volatile 常常与 synchronized 作比较,简单的说,synchronized 具有互斥性 & 可见性,而volatile 仅有可见性;可见性保证了线程间更新了之后其他线程可以马上发现更新的值。但是,volatile并不能保证多线程下变量操作的原子性。所以类似i++或者long类型的操作等,如果在volatile修饰的field上面,依然会产生脏数据。
要保证原子性,可以使用volatile + CAS的实现方式。
以下出自方腾飞《聊聊并发(一)深入分析Volatile的实现原理》

使用volatile变量修饰符如果使用恰当的话,它比synchronized的使用和执行成本会更低,因为它不会引起线程上下文的切换和调度

而这些都是Java内存模型保证的。