在 Java 中,volatile 可以保证被修饰的变量对于所有线程的可见性,同时也可以禁止对变量的重排序优化。
对于 volatile 变量的写操作,在 JVM 编译成汇编指令时会添加一个“Lock”前缀指令,这个指令会使得 CPU 将该写操作作为一个原子操作进行执行,同时也会使得该写操作的结果对其他线程立即可见。而对于 volatile 变量的读操作,则会插入一个“Load”指令,保证该操作之前的所有操作都完成后再进行读取,从而保证了可见性和有序性。
在 Java 5 及之前的版本中,由于缺少内存屏障等机制的支持,volatile 变量仅仅能够保证可见性,但不能保证有序性。而从 Java 5 开始,Java 引入了 JSR-133 内存模型规范,使得 volatile 变量能够保证有序性。根据该规范,对于 volatile 变量的写操作之前的所有操作都必须要完成后才能进行写操作,同时对于 volatile 变量的读操作,也会插入一条“Load Barrier”指令,保证读操作之前的所有操作都已经完成。这样就能够保证 volatile 变量的有序性。