• JMM设计时考虑的两个因素
  • JMM对不同重排序结果,采取的不同策略
  • happens-before的由来
  • JMM的happens-before保证
  • [ ] happens-before规则有哪些

    JMM设计时考虑的两个因素

    • 程序员因素:JMM站在程序员角度考虑,尽可能建造一个强内存模型。程序员只要关心具体业务
    • 编译器和处理器因素:JMM站在编译器和处理器角度考虑,尽可能弱内存模型,这样编译器和处理器可以对其优化

      JMM对不同重排序结果,采取不同策略

    • 若重排序影响最终的结果,JMM会禁止重排序

    • 若重排序不影响最终的结果,JMM会允许编译器和处理器进行重排序

      happens-before的由来

      happens-before的概念最初由Leslie Lamport在其一篇影响深远的论文(《Time, Clocks and the Ordering of Events in aDistributed System》)中提出。

JMM自己的happens-before定义:

  • 操作A happens-before 操作B,则操作A执行顺序一定是在操作B前
  • 若操作A、B满足happen-before规则,但两者重排序后不影响最终结果,操作B可能先执行

happens-before个人总结:

  • 重排序后不影响结果,满足happens-before规则。真正的执行顺序也可能重排序
  • 重排序后影响结果,满足happens-before规则。执行顺序一定是一定的

    happens-before规则

  1. 单线程中,操作A写在操作B前,那么操作A happens-before 操作B
  2. volatile变量的写操作 happens-before 后续的所有读操作
  3. 监视器锁的解锁happens-before 加锁
  4. 线程的start操作 happens-before 于 B线程中的任意操作
  5. 操作B中的任意操作 happens-before 线程B的 join返回