从JDK5开始,Java使用新的JSR-133内存模子。JSR-133提出了 happens-before 概念,通过这个概念来论述操纵之间的内存可见性。
happens-before 表达的是:前一个操纵的结果必要对后续操纵是可见的。这里提到的两个操纵既可以是在一个线程内,也可以是差别线程之间。
class VolatileExample { int x = 0; volatile boolean v = false; public void writer() { x = 42; v = true; } public void reader() { if (v == true) { //x的值是多少呢? } }}
步伐序次规则
在一个线程中,按照代码的序次,前面的操纵happens-before于反面的恣意操纵 比方:赋值操纵 x = 42 先于 v = true 实行
// 在线程A中将x变量的值初始化为0private int x = 0;public void execute() { // 在线程A中初始化线程B Thread threadB = new Thread(() -> { // 线程B检测本身是否被停止 if (Thread.currentThread().isInterrupted()) { // 如果线程B被停止,则此时x的值为100 System.out.println(x); } }); // 在线程A中启动线程B threadB.start(); // 在线程A中将共享变量x的值修改为100 x = 100; // 在线程A中停止线程B threadB.interrupt();}
对象闭幕规则
一个对象的初始化完成happens-before于它的finalize()方法的开始
public class TestThread { public TestThread() { System.out.println("构造方法"); } @Override public void finalize() throws Throwable { System.out.println("对象烧毁"); } public static void main(String[] args) { new TestThread(); System.gc(); }}运行结果