跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Java内存模型(Java Memory Model, JMM)
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= Java内存模型(Java Memory Model, JMM) = == 介绍 == '''Java内存模型(JMM)'''是Java并发编程的核心规范,定义了多线程环境下线程如何与内存交互,确保线程安全性。JMM通过'''happens-before关系'''、'''内存屏障'''等机制解决可见性、有序性和原子性问题,是理解`synchronized`、`volatile`、`final`等关键字底层原理的基础。 == 核心概念 == === 1. 主内存与工作内存 === JMM将内存分为两类: * '''主内存(Main Memory)''':存储所有共享变量的原始值。 * '''工作内存(Work Memory)''':每个线程私有的内存空间,存储线程操作变量的副本。 <mermaid> flowchart LR A[主内存] -->|读取| B(线程1工作内存) A -->|读取| C(线程2工作内存) B -->|写入| A C -->|写入| A </mermaid> === 2. happens-before关系 === JMM通过以下规则保证操作的有序性: * '''程序顺序规则''':同一线程内的操作按代码顺序执行。 * '''锁规则''':解锁操作先于后续的加锁操作。 * '''volatile规则''':volatile变量的写操作先于后续读操作。 * '''线程启动规则''':`Thread.start()`先于线程内的任何操作。 * '''传递性''':若A happens-before B,B happens-before C,则A happens-before C。 == 代码示例 == === volatile关键字 === <syntaxhighlight lang="java"> public class VolatileExample { private volatile boolean flag = false; public void writer() { flag = true; // 写操作 } public void reader() { if (flag) { // 读操作 System.out.println("Flag is true"); } } } </syntaxhighlight> '''输出'''(多线程环境下): <pre> Flag is true </pre> '''解释''':`volatile`保证`flag`的修改对所有线程立即可见。 === 双重检查锁定(DCL)问题 === <syntaxhighlight lang="java"> public class Singleton { private static volatile Singleton instance; public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); // 非原子操作 } } } return instance; } } </syntaxhighlight> '''解释''':`volatile`防止指令重排序,避免返回未初始化的对象。 == 实际应用场景 == * '''缓存一致性''':如Redis分布式锁的实现需遵循JMM。 * '''事件驱动架构''':如Kafka消费者线程通过`volatile`标志位控制退出。 * '''高性能计数器''':`AtomicLong`基于CAS和内存屏障实现。 == 常见问题 == === 1. 指令重排序 === 编译器/处理器可能优化指令顺序,JMM通过内存屏障禁止特定重排序。例如: <math> \text{StoreStore屏障} \rightarrow \text{写操作} \rightarrow \text{StoreLoad屏障} </math> === 2. 伪共享(False Sharing) === 多个线程修改同一缓存行的不同变量会导致性能下降。解决方案: <syntaxhighlight lang="java"> @Contended // Java 8+注解 private volatile long counter1; private volatile long counter2; </syntaxhighlight> == 总结 == {| class="wikitable" |- ! 特性 !! 实现机制 |- | 原子性 | `synchronized`、`CAS` |- | 可见性 | `volatile`、`final`、`happens-before` |- | 有序性 | 内存屏障、`volatile` |} JMM是编写正确高效并发程序的理论基础,开发者需结合具体场景选择同步策略。 [[Category:计算机科学]] [[Category:面试技巧]] [[Category:Java并发编程]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)