JMM
虚拟机保证以下原子操作:
- lock(锁定): 作用于主内存变量, 标识为线程独有
- unlock(解锁): 作用于主内存变量, 把变量释放
- read(读取): 作用于主内存变量, 把变量传输到工作内存
- load(载入): 作用于工作内存变量, 把read得到的变量放入到工作内存的变量副本
- use(使用): 作用于工作内存变量, 把工作副本的变量传递给执行引擎
- assign(赋值): 作用于工作内存变量, 把执行引擎的值赋值到工作内存
- store(存储): 作用于工作内存, 把工作内存的值送到主内存中
- write(写入): 作用于主内存, 把工作内存中得到的值放入主内存
happen-before
先行发生规则无需任何同步就能保障成立.
- 程序次序规则: 在一个线程内,按照程序代码顺序,书写在前面的操作先行发生于书写在后面的操作。
- 管程锁定规则: 一个unlock操作先行发生于后面对同一个锁的lock操作。
- volatile变量规则 :对一个volatile变量的写操作先行发生于后面对该变量的读操作。
- 线程启动规则: Thread对象的start()方法先行发生于此线程的每一个动作(即run()中的操作)。
- 线程终止规则: 线程中的所有操作都先行发生于对此线程的终止检查。我们可以通过Thread.join()方法结束,Thread.isAlive()返回值等手段检查到线程已经终止执行。
- 线程中断规则: 对线程interrupt()方法的调用先行发生于对此线程被中断线程的代码检测到中断事件的发生,可以通过Thread.interrupted(),Thread.isInterrupted()方法来检查到是否发生中断事件。
- 对象终结规则: 一个对象的初始化完成(构造函数执行完毕)先行发生于他的finalize()方法的开始。
- 传递性: 如果操作A先行发生于操作B,操作B先行发生于C, 那么就可以得到A先行发生于操作C。