⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 http://cmsblogs.com/?p=2167 「小明哥」欢迎转载,保留摘要,谢谢!

作为「小明哥」的忠实读者,「老艿艿」略作修改,记录在理解过程中,参考的资料。


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

经过四篇博客阐述,我相信各位对 Java 内存模型有了最基本认识了,下面 LZ 就做一个比较简单的总结。

1. 总结

老艿艿:此处的总结,内容上不是完全线性的,而是一些概念、原理等等关键点。

JMM 规定了线程的工作内存和主内存的交互关系,以及线程之间的可见性和程序的执行顺序。

  • 一方面,要为程序员提供足够强的内存可见性保证。
  • 另一方面,对编译器和处理器的限制要尽可能地放松。JMM 对程序员屏蔽了 CPU 以及 OS 内存的使用问题,能够使程序在不同的 CPU 和 OS 内存上都能够达到预期的效果。

Java 采用内存共享的模式来实现线程之间的通信。编译器和处理器可以对程序进行重排序优化处理,但是需要遵守一些规则,不能随意重排序。

在并发编程模式中,势必会遇到上面三个概念:

  • 原子性:一个操作或者多个操作要么全部执行要么全部不执行。
  • 可见性:当多个线程同时访问一个共享变量时,如果其中某个线程更改了该共享变量,其他线程应该可以立刻看到这个改变。
  • 有序性:程序的执行要按照代码的先后顺序执行。

JMM 对原子性并没有提供确切的解决方案,但是 JMM 解决了可见性和有序性,至于原子性则需要通过锁或者 synchronized 来解决了。

如果一个操作 A 的操作结果需要对操作 B 可见,那么我们就认为操作 A 和操作 B 之间存在happens-before 关系,即 A happens-before B 。

happens-before 原则,是 JMM 中非常重要的一个原则,它是判断数据是否存在竞争、线程是否安全的主要依据,依靠这个原则,我们可以解决在并发环境下两个操作之间是否存在冲突的所有问题。JMM 规定,两个操作存在 happens-before 关系并不一定要 A 操作先于B 操作执行,只要 A 操作的结果对 B 操作可见即可。

在程序运行过程中,为了执行的效率,编译器和处理器是可以对程序进行一定的重排序,但是他们必须要满足两个条件:

  1. 执行的结果保持不变
  2. 存在数据依赖的不能重排序。重排序是引起多线程不安全的一个重要因素。

同时,顺序一致性是一个比较理想化的参考模型,它为我们提供了强大而又有力的内存可见性保证,他主要有两个特征:

  1. 一个线程中的所有操作必须按照程序的顺序来执行。
  2. 所有线程都只能看到一个单一的操作执行顺序,在顺序一致性模型中,每个操作都必须原则执行且立刻对所有线程可见。

2. 博文列表

  1. 《【死磕 Java 并发】—– Java 内存模型之 happens-before》
  2. 《【死磕 Java 并发】—– Java 内存模型之重排序》
  3. 《【死磕 Java 并发】—– Java 内存模型之分析 volatile》
  4. 《【死磕 Java 并发】—– Java 内存模型之从 JMM 角度分析 DCL》

3. Java内存模型推荐资料

  1. 程晓明:《深入Java内存模型》

    老艿艿:自己和蛮多朋友都看过,必读!!!另外,这本小书也被整理到了 《Java 并发编程的艺术》「3. Java 内存模型」 章节。

  2. 周志明:《深入理解 Java 虚拟机》「第五部分 高效并发」

  3. 《Java 并发编程:volatile 的使用及其原理》

  4. 《Java并发编程:volatile 关键字解析》

  5. 《聊聊高并发(三十三)Java 内存模型那些事(一)从一致性(Consistency)的角度理解Java内存模型》

  6. 《聊聊高并发(三十四)Java 内存模型那些事(二)理解 CPU 高速缓存的工作原理》

  7. 《聊聊高并发(三十五)Java 内存模型那些事(三)理解内存屏障》

  8. 《聊聊高并发(三十六)Java 内存模型那些事(四)理解 happens-before 规则》

  9. 《happens-before 俗解》

666. 彩蛋

如果你对 Java 并发感兴趣,欢迎加入我的知识星球一起交流。

知识星球

文章目录
  1. 1. 1. 总结
  2. 2. 2. 博文列表
  3. 3. 3. Java内存模型推荐资料
  4. 4. 666. 彩蛋