为什么要设计JAVA内存模型?

小陈:老王,看了上一篇的《CPU多级缓存模型》,有个疑问为什么还要有JAVA内存模型啊?

老王:这么来说吧,CPU多级缓存模型,只是一个规范,但是底层基于这个规范的实现还是有很多种的。比如:

(1)基于这个模型之上不同的计算机厂商可能对这个模型底层的实现不一样,包括底层运行的指令集、有的还基于多级缓存模型之上还引入了写换从器、无效队列等。

(2)不同的操作系统windows、linux的指令集不一样。

老王:

所以JAVA语言为了应对上述的问题:不同的系统、不同的计算机厂商的底层实现不同。基于它们之上设计了一个JAVA内存模型(JMM)的规范,就是为了屏蔽底层操作系统、厂商之间的差异性。程序员运行是只需要关注JMM,而不需关注底层系统、厂商指令的差异性,这些由JMM去适配不同的系统和厂商的指令集,这样就能实现一次编写,“到处乱跑”的跨平台效果。

小陈:哦哦,原来是为了屏蔽操作系统、不同的计算机厂商的底层的差异性,实现跨平台的无差异性运行的效果啊。

JAVA内存模型是怎么样的?

小陈:原因我大概知道了,那JAVA内存模型大概是个什么样的结构啊?

老王:给你看下下面这张图,你大概就理解了

老王:上图就是JAVA内存模型的大致结构图,JAVA内存模型定义了一个规范。那就是每个线程都有自己的工作内存,线程操作共享变量的时候需要从主内存读取到自己的工作内存,然后在传递给工作线程使用,共享变量修改后先刷新到工作内存,然后再刷新回主内存;这个JAVA内存模型是基于我们上一讲CPU多级缓存模型上建立的。

JAVA内存模型定义的八种原子操作

小陈:看了上面的图,JAVA内存模型的结构我基本知道了,但是JMM这哥们怎么工作的我还是很模糊啊?

老王:没关系,我来给你讲讲,JMM定义了8种指令,它工作的时候就是通过这8种指令来操作内存的。

包括怎么锁定变量、怎么将数据从主存传到工作内存、怎么传给正在被CPU调度的线程、修改之后CPU怎么传回工作内存、工作内存又怎么传递回主存

1. lock(锁定):把主内存中的一个共享变量标记为一个线程独享的状态

2. unlock(解锁):把主内存的变量从线程独享的lock状态中解除出来

3. read(读取):把主内存的一个共享变量传输工作内存中

4. load(载入):把从主内存传输到工作内存的共享变量,赋值给工作内存中的变量副本

5. use(使用):把工作内存中的变量副本的值,传递给执行引擎CPU

6. assign(赋值):执行引擎(CPU)执行完之后,把修改过的变量值重新赋值给工作内存中的变量副本

7. store(存储):把工作内存中修改过共享变量的值传递到主内存中

8. write(写入):把传递到主内存中的变量值,重新写回给主内存的共享变量

小陈:...., 这都啥啊...

老王:给你画张图吧,你就了解了:

比如线程A要执行一个x++的操作,可能要经历下面的过程:

小陈:牛逼啊老王....

小陈:额,感觉不对啊,上面只有六种指令,还有另外两种lock、unlock指令是咋用的?

老王:这还不简单,再给你画张图就KO了。

比如还是上面的x++操作

(1)工作线程A操作该共享内存变量的时候,执行lock指令,主内存中的这个共享变量;同时告诉线程B这个共享变量我准备修改了,让它失效掉。

(2)B线程的变量副本失效之后,运行时候用到,需要到主内存重新读取(执行read、load操作放入工作内存);发现该主内存的变量被锁定了,读取失败;此时相当于线程A拥有该变量的独享操作

(3)线程A执行i++操作,经历上述说的(read、load、use、assign、store、write)指令之后;操作完成执行unlock释放锁定的这个内存变量

(4)线程B这个时候再去主内存读取的时候,发现未被锁定,就可以重新读取了

小陈:牛逼啊老王,听君一席话,白读十年书。献上我的掌声......

多线程并发在JMM操作带来的可见性问题

小陈:JMM以及它的8中基本操作我了解了,但是我发现了个问题,在多线程操作的时候可能会有数据不一致的问题,比如我画个图讲一下我的想法:

线程A和线程B同时执行共享变量x的++操作;线程B在线程A将x=1的值刷入主内存之前读取x=0,这样就会导致数据错了。

老王:很好,看来小陈很聪明啊,理解得很快啊

小陈:嘿嘿,一般般啦...

老王:你说的这个问题,正是多线程并发操作的可见性问题。

小陈:我知道多线程并发操作的时候,会有可见性、有序性、原子性的问题,这种情况会导致可见性问题我知道了,但是有序性和原子性是什么?什么时候会发生的?会导致什么问题?

老王:哈哈,你有这个好奇心很好,我们今天先说这么多,可见性、有序性、原子性的问题我们留到下一篇再说,别急哦,一点点慢慢来,啧啧..

关注小陈,公众号上更新更多的java并发文章

JAVA并发文章目录(公众号)

JAVA并发专题 《筑基篇》

1.什么是CPU多级缓存模型?

2.什么是JAVA内存模型?

3.线程安全之可见性、有序性、原子性是什么?

4.什么是MESI缓存一致性协议?怎么解决并发的可见性问题?

JAVA并发专题《练气篇》

5.volatile怎么保证可见性?

6.什么是内存屏障?具有什么作用?

7.volatile怎么通过内存屏障保证可见性和有序性?

8.volatile为啥不能保证原子性?

9.synchronized是个啥东西?应该怎么使用?

10.synchronized底层之monitor、对象头、Mark Word?

11.synchronized底层是怎么通过monitor进行加锁的?

12.synchronized的锁重入、锁消除、锁升级原理?无锁、偏向锁、轻量级锁、自旋、重量级锁

13.synchronized怎么保证可见性、有序性、原子性?

JAVA并发专题《结丹篇》

14. JDK底层Unsafe类是个啥东西?

15.unsafe类的CAS是怎么保证原子性的?

16.Atomic原子类体系讲解

17.AtomicInteger、AtomicBoolean的底层原理

18.AtomicReference、AtomicStampReference底层原理

19.Atomic中的LongAdder底层原理之分段锁机制

20.Atmoic系列Strimped64分段锁底层实现源码剖析

JAVA并发专题《金丹篇》

21.AQS是个啥?为啥说它是JAVA并发工具基础框架?

22.基于AQS的互斥锁底层源码深度剖析

23.基于AQS的共享锁底层源码深度剖析

24.ReentrantLock是怎么基于AQS实现独占锁的?

25.ReentrantLock的Condition机制底层源码剖析

26.CountDownLatch 门栓底层源码和实现机制深度剖析

27.CyclicBarrier 栅栏底层源码和实现机制深度剖析

28.Semaphore 信号量底层源码和实现机深度剖析

29.ReentrantReadWriteLock 读写锁怎么表示?

30. ReentrantReadWriteLock 读写锁底层源码和机制深度剖析

JAVA并发专题《元神篇》并发数据结构篇

31.CopyOnAarrayList 底层分析,怎么通过写时复制副本,提升并发性能?

32.ConcurrentLinkedQueue 底层分析,CAS 无锁化操作提升并发性能?

33.ConcurrentHashMap详解,底层怎么通过分段锁提升并发性能?

34.LinkedBlockedQueue 阻塞队列怎么通过ReentrantLock和Condition实现?

35.ArrayBlockedQueued 阻塞队列实现思路竟然和LinkedBlockedQueue一样?

36.DelayQueue 底层源码剖析,延时队列怎么实现?

37.SynchronousQueue底层原理解析

JAVA并发专题《飞升篇》线程池底层深度剖析

38. 什么是线程池?看看JDK提供了哪些默认的线程池?底层竟然都是基于ThreadPoolExecutor的?

39.ThreadPoolExecutor 构造函数有哪些参数?这些参数分别表示什么意思?

40.内部有哪些变量,怎么表示线程池状态和线程数,看看道格.李大神是怎么设计的?

41. ThreadPoolExecutor execute执行流程?怎么进行任务提交的?addWorker方法干了啥?什么是workder?

42. ThreadPoolExecutor execute执行流程?何时将任务提交到阻塞队列? 阻塞队列满会发生什么?

43. ThreadPoolExecutor 中的Worker是如何执行提交到线程池的任务的?多余Worker怎么在超出空闲时间后被干掉的?

44. ThreadPoolExecutor shutdown、shutdownNow内部核心流程

45. 再回头看看为啥不推荐Executors提供几种线程池?

46. ThreadPoolExecutor线程池篇总结

2.什么是JAVA内存模型?相关推荐

  1. 从底层吃透java内存模型(JMM)、volatile、CAS

    前言 随着计算机的飞速发展,cpu从单核到四核,八核.在2020年中国网民数预计将达到11亿人.这些数据都意味着,作为一名java程序员,必须要掌握多线程开发,谈及多线程,绕不开的是对JMM(Java ...

  2. 循序渐进:带你理解什么是Java内存模型

    近期笔者在阅读<深入理解Java虚拟机:JVM高级特性与最佳实现(第3版)>,书中提到关于Java内存模型的知识点,但是看完之后还是感觉有些模糊,便查阅一些其他相关资料.本文是笔者经过对知 ...

  3. java并发编程实战:第十六章----Java内存模型

    一.什么是内存模型,为什么要使用它 如果缺少同步,那么将会有许多因素使得线程无法立即甚至永远看到一个线程的操作结果 编译器把变量保存在本地寄存器而不是内存中 编译器中生成的指令顺序,可以与源代码中的顺 ...

  4. JSR 133 Java内存模型以及并发编程的最权威论文汇总

    Java内存模型 先看官方文档: https://docs.oracle.com/javase/specs/ JSR 133:Java TM内存模型和线程规范修订版:https://www.jcp.o ...

  5. java线程的优先级是数字越大优先级越高_《深入理解Java虚拟机》5分钟速成:12章(Java内存模型与线程)...

    第12章 Java内存模型与线程 前言: 1.物理机如何处理并发问题? 2.什么是Java内存模型? 3.原子性.可见性.有序性的具体含义和应用实现? 4.volatile 关键字特性? 5.基于vo ...

  6. Java内存模型与线程

    一.一致性 高速缓存的存储交互很好的解决了处理器与内存的速度矛盾,但也存在缓存一致性(cache coherence)问题 二.java内存模型 内存模型:对特定的内存或高速缓存进行读写访问的过程抽象 ...

  7. java内存模型-JMM

    java内存模型 转载于:https://www.cnblogs.com/our880tom/p/6679068.html

  8. 深入理解Java内存模型(四)——volatile

    2019独角兽企业重金招聘Python工程师标准>>> volatile的特性 当我们声明共享变量为volatile后,对这个变量的读/写将会很特别.理解volatile特性的一个好 ...

  9. java和内存交互,java内存模型-内存间交互操作

    前言 本文是阅读周志明大佬的<深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)>第12章,12.3节Java内存模型得来的读书笔记. 阅读告警

  10. 也许,这是东半球最叼的Java内存模型

    面试官:你好,你先自我介绍一下. 安琪拉:面试官你好,我叫安琪拉,草丛三婊,最强中单,草地摩托车车手,第21套广播体操推广者,火球拥有者.不焚者,安琪拉,这是我的简历,请过目. 面试官:看你简历上写熟 ...

最新文章

  1. Windows客户端C/C++编程规范“建议”——表达式和运算
  2. jsPlumb(3)-基本概念
  3. 后台判断ajax请求的请求后字段 。
  4. PK朱广权的手语数字人,现在要到医院银行上岗了
  5. 使用.NET读取XML文件
  6. word2003文档题注
  7. 特斯拉全球超级充电站已超过25000座 国内超过870座
  8. form表单序列化后的数据转json对象
  9. ContactsProvider的使用
  10. 记Dorado7学习(5)
  11. PageBarHelper(数字页码条帮助类)
  12. html safari图片不显示,html - 某些FA图标显示在FF,Chrome和Safari中,但没有浏览器会全部显示它们 - 堆栈内存溢出...
  13. java三层架构实现登录_用户登录——三层架构
  14. Mysql 利用存储过程 实现单据号码(单号)生成器(万能版)
  15. EXCEL里如何知道某种颜色的ColorIndex的值
  16. android只编译release版本
  17. [PAT A1028]List Sorting
  18. fmdb的一些基本的用法
  19. 天龙八部怀旧服务器维护,新天龙八部怀旧服 2月18日全服更新维护公告
  20. 开源leaflet地图组件的微信小程序版——leafletwx

热门文章

  1. C++利用SIO_GET_INTERFACE_LIST查询网关
  2. 如何保存微信视频到本地,微信朋友圈怎么发本地的视频。
  3. 微信小程序“网络出错,轻触屏幕重新加载” -1202
  4. 招聘 | 广州心理学公司招聘招商经理
  5. 有源代码就可以自行开发通达信交易接口了吗?
  6. 【LeetCode】825. Friends Of Appropriate Ages 解题报告(Python)
  7. 算法打卡Day16_leetcode _94. 二叉树的中序遍历
  8. Opencv--图像修复
  9. 工厂数字化转型必备的多协议转换网关
  10. vant上传图片时压缩图片