一、volatile

一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:

  1. 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的(保证可见性关键词:volatile,synchronized,final)。
  2. 禁止进行指令重排序。
  3. volatile修饰的变量,在多线程环境仍然是不安全的
  4. volatile适用于 运算结果不依赖变量当前值或确保只有一个线程修改变量的值

二、指令重排

  • 指令重排指的是JVM为了优化,在条件允许的情况下,对指令进行一定的重新排列。目的是为了直接运行当前能够立即执行的后续指令,避开获取下一条指令所需数据造成的等待。
  • 不是所有指令都可以重排,比如:写后读 a=1;b=a.