• volatile的本质是在告诉JVM当前变量在寄存器中的值是不确定的,需要从主存中读取。

  • vloatile仅能使用在变量级别,仅能实现变量的修改可见性。但不具备原子性。

  • volatile不会造成线程的阻塞。

  • volatile标记的变量不会被编译器优化。


volatile的不变性

  1. 将当前处理器缓存行的数据写回到系统内存。

  2. 这个写回内存的操作会引起在其它CPU里缓存了该内存地址的数据无效。


volatile禁止指令重排序

  • 普通变量仅仅会保证在方法执行过程中所有依赖赋值的结果的地方都能获取到正确的结果,而不能保证变量赋值操作的顺序与程序代码中的执行顺序一致。

volatile与synchronized的区别(重点)

  1. volatile、final、synchronized都可以实现可见性。

  2. volatile的本质是在告诉JVM当前变量在寄存器中的值是不确定的,需要从主存中读取。synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞。

  3. vloatile仅能使用在变量级别,synchronized可以使用在变量,方法和代码块。

  4. volatile仅能实现变量的修改可见性。但不具备原子性。而synchronized则可以保证变量的修改可见性和原子性。

  5. volatile不会造成线程的阻塞,而synchronized可能会造成线程阻塞。

  6. volatile标记的变量不会被编译器优化,而synchronized标记的变量可以被编译器优化。