Happens-Before(Java内存模型JMM是共享内存的并发模型,线程之间通过读写共享变量来实现隐形通信。JMM通过Happens-Before原则提供跨线程内存的可见性保证)原则:
定义:
1、如果一个操作happens-before另一个操作,那么第一个操作的结果对第二个可见,且第一个执行顺序在第二个之前。
2、两个操作存在happens-before关系,并不意味着Java平台具体实现必须按照happens-before指定顺序执行,如果重排序之后的执行结果与按happens-before执行结果一致,JMM允许这样操作。
规则:
1、程序次序原则:一个线程中,按照程序的顺序,前面的操作happens-before后面的操作(编译器并不一定按照这个顺序执行,但是会保证执行结果==按照顺序推演的结果)
2、锁定原则:如果线程1解锁了monitor a,接着线程2锁定了a,那么线程1解锁a之前的写操作都对线程2可见(线程1线程2可以为同一个线程)
3、volatile原则:如果线程1写入volatile变量V(对象的字段,类字段或数组元素),接着线程2读取了V,那么线程1写入V及之前的写操作都对线程2可见
4、传递原则:如果线程a happeds-before线程b,线程b happens-before线程c,那么线程a happens-before 线程c
5、start()原则:线程A中启动线程B,线程B中可以看到线程A启动B之前的操作。也就是说start() happens-before线程B中的操作
6、线程join()原则:主线程A等待子线程B完成,B执行完毕后,主线程A可以看到子线程B的所有操作。也就是说子线程B中的所有操作happens-before join()的返回。
7、线程中断原则:对线程interrupted()的调用happens-before被中断线程的代码检测到中断时间的发生
8、对象finalize原则:对象的初始化happens-before对象的finalize操作。