Java内存模型之happens-before和重排序

重排序

在执行程序时,为了提供性能,处理器和编译器经常会对指令进行重排序,知足如下两个条件:并发

  1. 在单线程环境下不能改变程序运行的结果;
  2. 存在数据依赖关系的不容许重排序

happens - before

原则定义

    1. 若是一个操做happens-before另外一个操做,那么第一个操做的执行结果将对第二个操做可见,并且第一个操做的执行顺序排在第二个操做以前。
    1. 两个操做之间存在happens-before关系,并不意味着必定要按照happens-before原则制定的顺序来执行。若是重排序以后的执行结果与按照happens-before关系来执行的结果一致,那么这种重排序并不非法。

原则规则

  1. 程序次序规则:一个线程内,按照代码顺序,书写在前面的操做先行发生于书写在后面的操做;
  2. 锁定规则:一个unLock操做先行发生于后面对同一个锁额lock操做;
  3. volatile变量规则:对一个变量的写操做先行发生于后面对这个变量的读操做;
  4. 传递规则:若是操做A先行发生于操做B,而操做B又先行发生于操做C,则能够得出操做A先行发生于操做C;
  5. 线程启动规则:Thread对象的start()方法先行发生于此线程的每一个一个动做;
  6. 线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生;
  7. 线程终结规则:线程中全部的操做都先行发生于线程的终止检测,咱们能够经过Thread.join()方法结束、Thread.isAlive()的返回值手段检测到线程已经终止执行;
  8. 对象终结规则:一个对象的初始化完成先行发生于他的finalize()方法的开始;

连接

【死磕Java并发】—–Java内存模型之重排序app

【死磕Java并发】—–Java内存模型之happens-before性能

相关文章
相关标签/搜索