Java并发10:Java内存模型(JMM) - 抽象的内存模型
引言:从硬件到Java的抽象 在上一篇文章中,我们学习了CPU缓存、MESI协议、False Sharing等硬件层面的并发机制。但问题来了: 作为Java开发者,我们需要关心这些底层细节吗? 看这个例子: public class VisibilityProblem { private boolean flag = false; private int data = 0; // 线程1 public void writer() { data = 42; // 1 flag = true; // 2 } // 线程2 public void reader() { if (flag) { // 3 int result = data; // 4 System.out.println(result); // 可能输出0! } } } 三个疑问: 为什么线程2可能看不到flag = true?(可见性问题) 为什么即使看到flag = true,也可能读到data = 0?(有序性问题) 这个行为在不同CPU上是否一致?(平台差异) Java的解决方案:Java内存模型(JMM) JMM就像一份**“合同”**: 对JVM实现者:规定必须遵守的行为规范 对Java程序员:提供统一的并发语义保证 屏蔽平台差异:无论x86、ARM还是RISC-V,行为一致 本篇文章,我们将深入理解JMM的设计理念和工作机制。 一、为什么需要Java内存模型? 1.1 硬件层面的挑战 不同CPU架构的内存模型差异巨大: CPU架构 内存模型 Store-Load重排序 说明 x86/x64 TSO (Total Store Order) 否 较强的内存模型,大部分情况有序 ARM Weak 是 弱内存模型,重排序激进 RISC-V RVWMO 是 类似ARM,弱内存模型 PowerPC Weak 是 弱内存模型 示例:同样的Java代码,在x86上可能正常,在ARM上可能出错! ...