Java内存模型(JMM)与happens-before
请解释Java内存模型(JMM)的核心概念,以及happens-before原则的8条规则。
回答
苦行僧
JMM核心概念:
- 定义线程与主内存之间的抽象关系:每个线程有工作内存,保存主内存变量的副本。
- 解决可见性、有序性、原子性问题。
- 屏蔽不同硬件和操作系统的内存访问差异。
happens-before原则(8条):
- 程序次序规则:同一线程内,前一个操作happens-before后一个操作。
- volatile变量规则:对volatile的写happens-before后面对该volatile的读。
- 锁定规则:unlock() happens-before后续同一个锁的lock()。
- 传递性:A happens-before B,B happens-before C → A happens-before C。
- 线程启动规则:Thread.start() happens-before该线程的任何动作。
- 线程终止规则:线程所有操作happens-before对该线程的Thread.join()返回。
- 线程中断规则:Thread.interrupt() happens-before被中断线程检测到中断事件。
- 对象终结规则:对象构造完成(构造方法结束)happens-before finalize()开始。
作用:满足happens-before的两个操作之间,JMM不禁止重排序。