在《Java 并发编程:核心理论》一文中,我们已经提到过可见性、有序性及原子性问题,通常情况下我们可以通过 Synchronized 关键字来解决这些个问题,不过如果对 Synchronized 原理有了解的话,应该知道 Synchronized 是一个比较重量级的操作,对系统的性能有比较大的影响,所以,如果有其他解决方案,我们通常都避免使用 Synchronized 来解决问题。而 volatile 关键字就是 Java 中提供的另一种解决可见性和有序性问题的方案。对于原子性,需要强调一点,也是大家容易误解的一点:对 volatile 变量的单次读 / 写操作可以保证原子性的,如 long 和 double 类型变量,但是并不能保证 i++ 这种操作的原子性,因为本质上 i++ 是读、写两次操作。