JAVA内存模型

近端抽时间稍微了解了一下java内存模型

1,CPU多级缓存-会里出现乱序执行

处理器为提高运算速度而违背了代码原有的顺序的优化(这是cpu本身自己的优化功能)

这种优化在单核情况下没有问题,但是在多核情况下就会出问题了,计算结果将不准确

2,Java内存模型(Java Memory Model.JMM)

既然出现多核下计算不准确,各种硬件与操作系统的访问有差异,那位了让java程序在各种环境下操作都没有问题,则

出现了jmm规范,他规定了一个线程如何和何时可以看到其他线程修改过的共享变量的值,以及在必须时,如何同步的

访问共享变量。

* Heap 是由GC 来负责的,堆的优势可以动态的分配内存大小,生存期也不必事先告诉编译器,因为他是在运行时动态分配内存的,java垃圾收集器是不再使用的数据,但是也有缺点,因为是运行时动态分配内存的,所以在存取速度是慢一些的,

* Stack 的优势是存取速度要比堆要快,仅次于计算机里的寄存器,栈的数据是共享的,如果两个线程同时访问一个对象,那么他们就会拥有这个变量的私有拷贝

* 上图是一个简单的cpu模型,分为 cpu->寄存器->高速缓存->主存

 

* 线程之间的共享变量是存在主内存中。

* 本地内存是一个java内存模型的抽象概念(他涵盖了缓存,写缓冲区,寄存器,以及其他的硬件),本地内存中存储了共享变量的副本。

* java 的工作内存是 寄存器和高速缓存的一个抽象的约束。

* 静态内存存储模型(JVM),它只是对内存的一种物理划分

JAVA内存模型-同步八中操作

lock(锁定):作用于主内存的变量,把一个变量标识为一条线程占状态

unlock(解锁):作用于主内存的变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定

read(读取):作用于主内存的变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用

load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中

user(使用):作用于工作内存的变量,把工作内存中的一个变量值传递给执行引擎

assgin(赋值):作用于工作内存的变量,它把一个从执行引擎收到的值赋值给工作内存的变量

store(存储):作用于工作内存的变量,把工作内存中的一个变量的值传送到主内存中,以便随后的write的操作

write(写入):作用于主内存的变量,它把store操作从工作内存中一个变量的值传送到主内存的变量中

JAVA内存模型-同步规则

* 如果要把一个变量从主内存中复制到工作内存,就需要按顺序到read和load操作,如果把变量从工作内存同步回主内存中,

就要按顺序地执行store和write操作,但java内存模型只要求上述操作必须按顺序执行,而没有保证必须是连续执行

* 不允许read 和load、store 和write操作之一单独出现

* 不允许一个线程无原因地(没有发生过任何assign操作)把数据从龚总内存同步回主内存中。

* 一个变量在同一时刻只允许一条线程对其进行lock操作,但lock操作可以被同一条线程重复执行多次,多次执行lock后,只有执行相同次数的unlock操作,变量才会被解锁,lock和unlock必须成对出现

* 如果对一个变量执行lock操作,将会清空工作内存中此变量的值,在执行引擎使用这个变量前需要重新执行load或assign操作初始化变量的值

* 如果一个变量事先没有被lock操作锁定,则不允许对它执行unlock操作;也不允许去unlock一个被其他线程锁定的变量。

* 对一个变量执行unlock操作之前,必须先把此变量同步到主内存中(执行store和write操作)

下图是操作的流转状态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值