• 一篇图文搞定Java内存模型


    如果觉得我的文章还不错的话就点个赞,关注一波,转发收藏吧,另外可以微信搜索【佘凡架构师】阅读更多的好文章,获取我为大家准备的资料。

    Java内存模型是个什么东西?

    内存模型描述了程序中各个变量(实例域、静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存中取出变量这样的底层细节,对象最终是存储在内存里面的,这点没有错,但是编译器、运行库、处理器或者系统缓存可以有特权在变量指定内存位置存储或者取出变量的值。【JMM】(Java Memory Model的缩写)允许编译器和缓存以数据在处理器特定的缓存(或寄存器)和主存之间移动的次序拥有重要的特权,除非程序员使用了volatile或synchronized明确请求了某些可见性的保证。—百度百科

    Java内存模型其实就是描述了CPU从主内存中读取数据,处理完毕后将数据回传给主内存的一系列过程。期间还包括多个内存变量在不同的CPU同时处理产生的一系列问题,如何解决以及保证可见性,有序性。

    让我们画张图理解一下吧

    JMM有八大指令:read,load,use,assign,store,write,lock,unlock。
    在这里插入图片描述

    让我们来简单描述一下JMM的运行过程

    1. 我们有一个CPU,CPU中有一个线程A,对应一块工作内存A。并且我们还有一块主内存。在这里插入图片描述
    2. 现在主内存中有一个data=0的数据,线程A想把它读到工作内存A中。于是就经过了read,load将data=0放入工作内存A中。在这里插入图片描述
    3. 现在线程A想对data进行+1的处理,于是先要将工作内存A中的data=1进行use,操作完毕以后再assign回工作内存A。
      在这里插入图片描述
    4. 最后工作内存A再将修改后的副本data=1数据同步给主内存
      在这里插入图片描述
    5. 通过以上的的流程,我们已经知道的6个指令:read,load,use,assign,store,write。那还有两个指令lock,unlock有什么作用?其实这两个指令就是在多线程同时操作内存变量时能够实现可见性。这样当线程A已经修改过的data变量,就能够及时通过MESI一致性协议/总线去通知其他线程data变量已经被修改,所以该data变量已经失效,需要重新从主内存中读取。在这里插入图片描述
  • 相关阅读:
    MySQL小白入门攻略
    leetcode 14. 最长公共前缀
    java项目-第165期ssm咨询交流论坛_ssm毕业设计_计算机毕业设计
    Android Qcom Display学习(十)
    VS2019+QT5.15调用动态库dll带有命名空间
    基于JAVA银行客户管理计算机毕业设计源码+系统+mysql数据库+lw文档+部署
    P8 服务拆分-服务远程调用
    【算法训练营】 - ①① 暴力递归
    智能家居浪潮来袭,如何让机器看懂世界 【结尾有资料】
    SQLite 的使用
  • 原文地址:https://blog.csdn.net/p874593785/article/details/125423584