简介
从JDK1.5,java使用新的JSR-133内存模型;JSR-133使用happens-before的概念来阐述操作之间的内存可见性;在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么者两个操作之间必须要存在happens-before关系;这里两个操作可以是在一个线程之内,也可以是在不同线程之间;
happens-before八大原则
1.程序次序原则:
在一个线程内,按照代码的顺序,书写在前面的代码优先于书写后面的代码;
2.管程锁定规则:
一个unlock操作先行发生于后面对同一个锁的lock操作,注意是同一个锁;
3.volatile原则:
对于一个volatile变量的写操作先行发生于后面对变量的读操作;
4.线程启动原则:
Thread对象的start()方法优先于此线程的每一个动作;
5.线程终止原则:
线程中所有的操作都优先发生于此线程的每一个动作;
6.对象中断原则:
对象的interrupt()方法的调用优先发生于被中断线程的代码监测中断事件的发生;先中断再检测;
7.对象终结原则:
一个对象的初始化(构造函数执行完毕)完成优先发生于它的finalize()方法的开始;
8.传递性
如果操作A先行发生于操作B,而操作B又先行发生于操作C,则可以得出操作A先行发生于操作C;