《深入理解 Java 虚拟机》学习 -- Java 内存模型

《深入理解 Java 虚拟机》学习 -- Java 内存模型

1. 区别

这里要和 JVM 内存模型区分开来:

  • JVM 内存模型是指 JVM 内存分区
  • Java 内存模型(JMM)是指一种虚拟机规范

2. 目的

缓存一致性

在硬件中,为了解决处理器与内存的速度矛盾,在两者之间使用了高速缓存,但也引入了新的问题:缓存一致性。

在多处理器系统中,每个处理器都有自己的高速缓存,而它们又共享同一主内存。当多个处理器的运算任务都涉及同一块主内存区域时,将可能导致各自的缓存数据不一致的情况。

为了解决一致性问题,需要各个处理器访问缓存时都遵循一些协议,这便是缓存一致性。

总结:

Java 内存模块是用来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的并发效果。


3. 主内存和工作内存

Java 内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。

  1. Java 内存模型规定了所有的变量都存储在主内存中,每个线程有自己的工作内存。
  2. 线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作(读取,赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量。不同线程之间也无法发直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成。

线程,主内存,工作内存三者的交互关系:


4. 内存间交互操作

关于主内存与工作内存之间具体的交互协议,即一个变量如何从主内存拷贝到工作内存、如何从工作内存同步回主内存之类的实现细节,Java 内存模型中定义了八种操作来完成,这里只讲解四种:

  • read(读取):作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随后的 load 动作使用。
  • load(载入):作用于工作内存的变量,它把 read 操作从主内存中得到的变量值放入工作内存的变量副本中。
  • store(存储):作用于工作内存的变量,它把工作内存中一个变量的值传送到主内存中,以便随后的 write 操作使用
  • write(写入):作用于主内存的变量,它把 store 操作从工作内存中得到的变量的值放入主内存的变量中

注意:

  1. 如果要把一个变量从主内存复制到工作内存,那就要按顺序地执行 read 和 load 操作,如果要把变量从工作内存同步回主内存,就要按顺序地执行 store 和 write 操作。
  2. Java 内存模型只要求上述两个操作必须按顺序执行,而没有保证必须是连续执行。即 read 与 load 之间、store 和 write 之间是可插入其他指令的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏泰斗贤若如

Could not find resource——mybatis 找不到映射器xml文件

今天用IDEA写Mybatis的时候,测试报了如图所示的错,恶心死我了,后来解决了,总结一下,防止下回跳坑,当然,也是做一个分享,如果有朋友遇到这个错,希望有所...

69120
来自专栏理想二旬不止

第六阶段-多线程:【第一章 多线程】

适合多个相同程序的代码去处理同一个资源的情况,把线程同程序的代码,数据有效分离,较好的体现了面向对象的设计思想

10940
来自专栏蚂蚁开源社区

前端常见技术点-Javascript扫盲(26问)

这里总结一下 WEB 前端面试 JS 部分的常见问题,同时这些问题也是对一些基础的技术概念和思想的理解。对这些基本知识的掌握程度和深度决定了你的技术层级。高级工...

12030
来自专栏宜信技术实践

微服务与网关技术(SIA-GateWay)

把时间退回到二十年之前,当时企业级领域研发主要推崇的还是C/S模式,PB、Delphi这样的开发软件是企业应用开发的主流。随着时间的推移,基于浏览器的B/S架构...

32540
来自专栏理想二旬不止

JDBC:【第一篇:入门知识介绍、工具类、PreparedStatment详解】

想要通过Java操作不同的数据库,应该根据数据库的不同而执行特定的API,而出于简化的想法,Sun公司,定义了一套面向所有关系型数据库的 API 即 JDBC ...

11020
来自专栏理想二旬不止

Java反射:Web学习的灵魂

我们将类分为三部分,成员变量,构造方法,成员方法,代码编译后,变成了字节码文件(.class文件)而万物皆对象,所以在字节码文件中,又将这三部分分别整合成对象,...

8920
来自专栏理想二旬不止

第五阶段-IO基础:【第一章 异常】

try 后面的一对大括号内的内容即受到监控的程序,也就是说这一段代码是可能存在异常的,而Catch中由开发者,根据自身推断可能存在的异常,书写对应异常类型以及处...

7730
来自专栏须臾之余

Java集合源码分析之ArrayList

分析一个类的时候,数据结构往往是它的灵魂所在,理解底层的数据结构其实就理解了该类的实现思路,具体的实现细节再具体分析。

8020
来自专栏MudOnTire

常见数据结构和Javascript实现总结

做前端的同学不少都是自学成才或者半路出家,计算机基础的知识比较薄弱,尤其是数据结构和算法这块,所以今天整理了一下常见的数据结构和对应的Javascript的实现...

9330
来自专栏理想二旬不止

注解:为计算机而做的注释

编写文档:通过代码里标识的注解生成文档【生成文档doc文档】 代码分析:通过代码里标识的注解对代码进行分析【使用反射】 编译检查:通过代码里标识的注解让编译器能...

12520

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励