JMM的理解学习

举报
多米诺的古牌 发表于 2021/09/30 16:18:27 2021/09/30
【摘要】 1.JMM的定义JMM是JAVA 的内存模型(java memory model),不存在的东西,是一种概念或者约定,规定了内存主要划分为主内存和工作内存两种。而所规定的主内存和工作内存跟JVM内存划分(堆、栈、方法区)是在不同的层次上进行的,但是用类比的方法可以将主内存类比为Java堆中的对象实例部分,工作内存类比为栈中的部分区域,从更底层的来说,主内存对应的是硬件的物理内存,工作内存对应...

1.JMM的定义

JMM是JAVA 的内存模型(java memory model),不存在的东西,是一种概念或者约定,规定了内存主要划分为主内存工作内存两种。而所规定的主内存和工作内存跟JVM内存划分(堆、栈、方法区)是在不同的层次上进行的,但是用类比的方法可以将主内存类比为Java堆中的对象实例部分,工作内存类比为栈中的部分区域,从更底层的来说,主内存对应的是硬件的物理内存,工作内存对应的则是寄存器和高速缓存。

为什么我们要定义这么一个规则呢?是因为在不同的硬件生产商和不同的操作系统下,内存的访问逻辑是有一定的差异的,即当代码在某个系统环境下运行正常并且线程安全,但是换了个系统就出现了各种的问题。Java内存模型(JMM)应就这样运而生,为了屏蔽系统和硬件的差异,让一套代码在不同平台下能到达相同的访问结果。

2.关于JMM的同步约定

2.1线程解锁前

必须把共享变量立刻刷回主内存(因为线程在处理变量的时候是,复制了一份在自己的线程的工作内存中进行处理,此处意思是将自己线程中的变量立刻刷回主存中,让线程的工作内存中和主存中的变量保持一致)

2.2 线程加锁前

必须读取主内存中的最新值更新到工作内存中,也是为了让工作内存中的变量和线程中保持一致。

2.3 加锁和解锁是必须同一把锁(不是同一把锁的话,大家就各玩各的了,没办法一块愉快玩耍了)。

3.JMM的八种交互操作

JMM交互操作共有8种(在主存和工作内存之间进行的操作)并且虚拟机实现必须保证每一个操作都是原子的,不可在分的。方法如下:
3.1 lock

加锁操作,作用于主内存的变量,把一个变量标识为线程独占状态;
3.2 unlock

解锁操作,作用于主内存的变量,把一个处于锁定状态的变量释放出来,释放后的变量才能被其他线程锁定;
3.3 read

从主存中读取操作,作用于主内存变量,把一个变量的值从主内存读取到线程的工作内存中,以便随后的load动作使用;
3.4 load

将主存中读取的数据写入工作内存的加载写入操作,作用于工作内存的变量,把read操作读取的变量从主存中放入工作内存中;
3.5 use

执行引擎使用加载到工作内存中的数据的操作,作用于工作内存中的变量,把工作内存中的变量传输给执行引擎,当虚拟机遇到需要使用到变量的值就会使用这个指令;
3.6 assign

执行引擎将use使用操作后的数据再赋值回工作内存的赋值操作,作用于工作内存中的变量,把从执行引擎中接受到的值放入工作内存的变量副本中;
3.7 store

将assign赋值到工作内存后进行的读取操作(准备再写入到主内存中),作用于主内存中的变量,把从工作内存中变量的值传送到主内存中,以便后续的write操作使用;
3.8 write

将从工作内存中通过store读取操作读取的数据写入到主内存的写入操作,作用于主内存中的变量,把store操作从工作内存中得到的变量的值放入主内存的变量中;

4.JMM对这八种操作的使用制定的规则

4.1 不允许read和load、store和write操作之一单独出现,必须成双成对不能分开~
4.2 不允许线程丢弃其最近的assign操作,即工作内存中的变量数据发生改变之后必须告知主内存;
4.3 不允许线程将没有assign操作的数据从工作内存同步回主内存;
4.4 不允许工作内存直接使用一个未被初始化的变量,新的变量必须在主内存中诞生,即use操作之前必须经过load操作或者或者store操作之前必须经过assign操作;
4.5 一个变量同一时间只有一个线程能对其进行lock加锁操作,多次lock加锁操作后,必须执行相同次数的unlock解锁操作才能解锁;
4.6 如果对一个变量进行lock操作,会清空所有工作内存中此变量的值,在执行引擎使用这个变量前,必须重新load或assign操作初始化变量的值;
4.7 如果一个变量没有被lock加锁操作,就不能对其进行unlock解锁操作,也不能unlock解锁一个被其他线程加锁操作锁住的变量;
4.8 对一个变量进行unlock解锁操作之前,必须把此变量同步回主内存;

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。