原子性:原子性是指一个操作是不可分割的,要么全部执行,要么全部失败。jvm 定义了以下 8 种操作是具有原子性的(下面的操作都是 jvm 可读的汇编指令)):
lock(锁定):作用于主内存中的变量,它把一个变量标识为一个线程独占的状态;
unlock(解锁):作用于主内存中的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定
read(读取):作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便后面的load动作使用;
load(载入):作用于工作内存中的变量,它把read操作从主内存中得到的变量值放入工作内存中的变量副本
use(使用):作用于工作内存中的变量,它把工作内存中一个变量的值传递给执行引擎,每当虚拟机遇到一个需要使用到变量的值的字节码指令时将会执行这个操作;
assign(赋值):作用于工作内存中的变量,它把一个从执行引擎接收到的值赋给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作;
store(存储):作用于工作内存的变量,它把工作内存中一个变量的值传送给主内存中以便随后的write操作使用;
write(操作):作用于主内存的变量,它把store操作从工作内存中得到的变量的值放入主内存的变量中。
可见性:可见性是指当一个线程修改了共享变量之后,能够立马同步到主存中,其他线程能够立即得知这个修改。
有序性:计算机执行程序时并不一定是按照我们编写的程序由上至下顺序执行,编译器和 CPU 会在保证输出结果和顺序执行一样的前提下,对指令进行重排序,使性能得到优化。如果 CPU 是单核,那这种优化不会带来线程执行冲突。但多核 CPU 的情况下,多线程并发操作共享变量,这种指令重排序可能导致意想不到的结果。