Happens-Before
编译器会对程序进行优化,会调整代码的顺序。如果贸然调整顺序的话,可能会引发线程不安全!
Java指定了Happens-Before六条规则,要求编译器必须满足Happens-Before原则,来控制数据的内存可见性。Happens-Before就是在什么之前发生的意思。
1、在同一线程中,按照程序代码的顺序,前面的操作happens-before 后面的操作。也就是说前面操作的结果对于后面是可见的。
x = 40;
y = 60;
当执行y = 60的时候,之前对x的更改为40的操作是可见的。
2、volatile写操作happens-before后续的读操作,读操作对于之前的写操作是可见的。
当前面的volatile变量发生写操作时,后面的语句对这个写操作是可见的。
3、传递性
如果 A happens-before B,B happens-before c ,那么 A happens-before C,也就是A的操作对C同样可见。
4、加锁的可见。如果A线程 happens-before B线程拥有锁,那么A线程在拥有锁期间的所有操作对B线程是可见的。
5、线程start()的可见。如果A线程调用了B线程,那么在B线程对A线程在调用B线程之前的所有操作可见
6、线程join()的可见。如果主线程A调用了B线程的join方法,那么在B线程结束之后,A线程对B线程中的操作是可见的。
上述中说的所有可见的意思就是,他们拥有的共享变量的写操作可见。