自我表扬:《Dubbo 实现原理与源码解析 —— 精品合集》
表扬自己:《D数据库实体设计合集》

摘要: 原创出处 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. 彩蛋