Java内存模型(JMM)

来源:互联网 发布:淘宝卖家修改评价链接 编辑:程序博客网 时间:2024/05/29 13:17

1.Java内存模型:
Java内存模型的主要目标:定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。
注意:上边的变量指的是共享变量(实例字段、静态字段、数组对象元素),不包括线程私有变量(局部变量、方法参数),因为私有变量不会存在竞争关系。

与Java内存区域中的堆、栈、方法区不可混淆:两者基本没有关系
主内存对应于堆中的对象实例数据部分 ——–物理硬件的内存
工作内存对应于虚拟机栈中的部分区域 ——–优先存储于寄存器和高速缓存中

2.内存模型图(图为copy)
这里写图片描述

所有共享变量存于主内存
每一条线程都有自己的工作内存(就是上图所说的本地内存)
工作内存中保存了被该线程使用到的变量的主内存副本
JMM通过控制主内存与每个线程的本地内存之间的交互,来为java程序员提供内存可见性保证。

3.内存间交互操作
lock:作用于主内存,把一个变量标识为一条线程独占的状态

read:把一个变量的值从主内存中传输到线程的工作内存
load:把read操作从主内存中获取到的变量值放入工作内存的变量中去

use:把工作内存中一个变量的值传递给执行引擎
asign:把一个从执行引擎接收到的值赋给工作内存的变量

store:把工作内存中的变量的值传送到主内存中
write:把store操作从工作内存中得到的变量值放入到主内存的变量中

unlock:作用于主内存,把一个处于锁定的变量释放

注意:
一个变量在同一时刻只允许一条线程对其进行lock操作
lock操作会将该变量在所有线程工作内存中的变量副本清空,否则就起不到锁的作用了
lock操作可被同一条线程多次进行,lock几次,就要unlock几次(可重入锁)
unlock之前必须先执行store-write
store-write必须成对出现(工作内存–>主内存)
read-load必须成对出现(主内存–>工作内存)

原创粉丝点击