Java内存模型

硬件的效率与一致性

原因

由于cpu的运算速度远远超过计算机的存储设备(内存等),而cpu又无法避免这些I/O操作,所以计算机不得不加
入一层读写速度尽可能接近处理器运算速度的高速缓存来作为cpu和内存之间的缓冲。

缓存一致性

在多处理器系统中,每个处理器都有自己的高速缓存,而它们又共享一块主内存,当它们的运算任务都涉及到同一
块主内存区域时,到底以谁的缓存数据为准呢?所以,各处理器访问缓存时都需要遵守一致性协议。

乱序执行优化

为了充分利用cpu的性能,除了增加高速缓存,处理器可能会对输入的代码进行乱序执行优化,但保证最终执行的
结果与顺序执行的结果一致。所以,如果一个任务依赖另一个任务的中间结果,就并不能用代码的先后顺序来保证
(后面讲到的volatile)。JVM也有指令重排序的优化。

寄存器、高速缓存与内存

寄存器(Register):集成在cpu中,用于暂存指令、数据和地址。
高速缓存(Cache):用于暂存内存中的数据,是内存的部分拷贝,分为一级、二级、三级缓存。
CPU <----> 寄存器 <----> 高速缓存 <----> 内存

处理器、高速缓存与主内存的交互

这里写图片描述

java内存模型

java跨平台原因

java跨平台原因:JVM定义了java内存模型,屏蔽了各种硬件和操作系统的内存访问差异,而c/c++等直接使用
物理硬件和操作系统的内存模型,所以在不同平台上会有差异。

主内存与工作内存

Java内存模型主要目标是定义程序中各个变量(实例字段,静态字段,数组中的元素,不包括局部变量与方
法参数,因为它们是线程私有的,不存在竞争)的访问规则。
这里写图片描述

所有变量都存储在主内存(虚拟机内存的一部分,可类比硬件的主内存)中,每条线程有自己的工作内存
(可类比高速缓存),线程的工作内存保存了该线程使用到的变量的主内存的副本拷贝,线程对变量的所有
操作(包括读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量。不同线程间的无法
直接访问对方的工作内存,必须通过主内存来传递变量值。

与运行时内存区域类比

主内存、工作内存与java堆、栈、方法区不是一个层次的内存划分,没有直接关系。真要类比,主内存对应于
java堆中的对象实例的数据部分(对象的数据和对象头是分开存放的,对象头存放在方法区),而工作内存则对应
于虚拟机栈的部分区域。

内存间交互操作

操作作用域作用
lock(锁定)主内存标志变量为线程独占
unlock(解锁)主内存释放锁定状态的变量
read(读取)主内存主内存 –> 工作内存
load(载入)工作内存将变量值放入工作内存的变量副本中
use(使用)工作内存工作内存 –> 执行引擎
assign(赋值)工作内存执行引擎 –> 工作内存
store(存储)工作内存工作内存 –> 主内存
write(写入)主内存将变量值写入主内存

关于volatile型变量

内存可见性

volatile是jvm提供的最轻量级的同步机制。
一个变量定义为volatile后,具备两个特性:
1、保证此变量对所有线程的可见性,是指当一条线程修改了该变量的值,新值对于其他线程是可以立刻得知的。
2、禁止指令重排序优化。
对于第一点:
如果是普通变量:线程A修改了变量值,从工作内存回写到主内存,线程B在线程A回写完成后,从主内存中进行读取操作,新变量值才会对变量B可见。
对于volatile变量:线程A修改了变量值,立即刷新同步到主内存,其他线程 使用 该变量时,立即从主内存中刷新该值。
volatile变量能保证内存的可见性,但不能保证一定是线程安全的,这取决于操作是否是原子性的。同时,volatile变量在工作缓存中也不一定是一致的,只是每次使用前需要先刷新,使得执行引擎看不到不一致的情况。
所以,不符合以下规则,在多线程情况下扔需要加锁:
1、运行结果并不依赖变量的当前值,或者能确保只有一个线程来修改变量的值
2、变量不需要与其他状态变量共同参与不变约束

原子性

原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。
在单处理器系统中,能够在单条指令中完成的操作都可以认为是” 原子操作”;
在多处理器系统中,CPU提供了在指令执行期间对总线加锁的手段,从而把总线锁住,这样同一总线上别的CPU就暂时不能通过总线访问内存了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值