CodeWalk

Java内存模型(JMM)与happens-before

作者:苦行僧 · 2026-05-30 12:55

请解释Java内存模型(JMM)的核心概念,以及happens-before原则的8条规则。

回答

苦行僧

JMM核心概念

  • 定义线程与主内存之间的抽象关系:每个线程有工作内存,保存主内存变量的副本。
  • 解决可见性有序性原子性问题。
  • 屏蔽不同硬件和操作系统的内存访问差异。

happens-before原则(8条):

  1. 程序次序规则:同一线程内,前一个操作happens-before后一个操作。
  2. volatile变量规则:对volatile的写happens-before后面对该volatile的读。
  3. 锁定规则:unlock() happens-before后续同一个锁的lock()。
  4. 传递性:A happens-before B,B happens-before C → A happens-before C。
  5. 线程启动规则:Thread.start() happens-before该线程的任何动作。
  6. 线程终止规则:线程所有操作happens-before对该线程的Thread.join()返回。
  7. 线程中断规则:Thread.interrupt() happens-before被中断线程检测到中断事件。
  8. 对象终结规则:对象构造完成(构造方法结束)happens-before finalize()开始。

作用:满足happens-before的两个操作之间,JMM不禁止重排序。