对于多线程共享的变量,JVM的内存模型(JMM)会为不同的线程分配缓存,并在缓存中进行操作后,再写回到主内存中。

​ 例:线程A和线程B都操作主线程中的一个变量X,JMM会在线程A和线程B上创建一个X的副本供操作,操作完成后再写回到主线程中。

​ 会带来线程间数据不同步的问题。volatile关键字修饰的变量,将会强制各线程在主内存中进行操作,禁用高速缓存,以达到一致性。一致性相对锁而言较弱,但是效率高。

​ 且编译器编译时,会对代码进行重排序优化,进而带来多线程安全问题。例:

int a = 1;
a = 2;
a = 3;
    
// 在编译器进行重排序优化后,上述语句会直接优化为:
int a = 3;

​ volatile关键字修饰的变量,不允许优化。