博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java内存模型
阅读量:3567 次
发布时间:2019-05-20

本文共 1096 字,大约阅读时间需要 3 分钟。

1 定义

Java内存模型(Java Memory Model,JMM)是Java虚拟机规范中定义的为了屏蔽掉各种硬件和操作系统间的内存访问差异,以实现Java程序在各平台下访问内存的一致性个定义的一种内存模型。

Java内存模型的主要目的是定义内存中各个变量的访问规则,也就是在虚拟机中将变量存入内存和从内存中访问变量的底层细节。

需要注意的一点是:这里的变量指的是实例字段、静态变量和数组内容,不包含方法的参数和局部变量,由于方法的参数和局部变量是线程私有的,所以不存在竞争现象。

2 内存的交互

Java内存模型定义了所有的变量都存储在主内存中,每个线程都有自己的工作内存,而工作内存中的数据其实都是从主内存中拷贝而来的副本。线程对变量的所有操作都是在工作内存中进行的,而不能够直接对主内存中的数据进行操作,除非在变量前加上volatile关键字。

不同的线程之间无法访问其他线程的工作内存中的数据,线程间数据的传递只能依靠主内存来进行。

以下是工作内存和主内存间的关系图:

关于工作内存和主内存的具体交互协议,即一个变量如何从主内存拷贝到工作内存、如何从工作内存同步到主内存,Java内存模型定义了以下八种操作来完成。

lock(锁定):作用于主内存,将主内存中的一个变量锁定,变成线程独有。

unlock(解锁):作用于主内存,将一个处于锁状态的变量释放出来,以便于其他线程使用。

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

load(载入):作用于工作内存,把一个从主内存读取的变量的值,存入工作内存中的变量副本。

use(使用):作用于工作内存,把一个工作内存的值传递给执行引擎,每当遇到使用一个变量的字节码指令的时候将执行这个操作。

assign(赋值):作用于工作内存,执行引擎将一个值赋值给工作内存中的变量。

store(存储):作用于工作内存,把一个工作内存的值传输给主内存,以便后面的write操作。

write(写入)作用于主内存,把一个从工作内存获取的值放入主内存。

3 重排序

在程序执行的时候,为了提高性能编译器和处理器会堆指令进行重排序,重排序分成以下三种。

(1)编译器优化的重排序。编译器在不改变单线程程序语义放入前提下,可以重新安排语句的执行顺序。

(2)指令级并行的重排序。现代处理器采用了指令级并行技术来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。
(3)内存系统的重排序。由于处理器使用缓存和读写缓冲区,这使得加载和存储操作看上去可能是在乱序执行。

转载地址:http://vukgj.baihongyu.com/

你可能感兴趣的文章
Java基础入门 Math类
查看>>
Java基础入门 Random类
查看>>
Java基础入门 Date类
查看>>
Java基础入门 Calendar类
查看>>
Java基础入门 DateFormat类
查看>>
Java基础入门 Window类及Panel类
查看>>
Java基础入门 AWT事件处理
查看>>
Java基础入门 鼠标事件
查看>>
Java基础入门 键盘事件
查看>>
Java基础入门 GridLayout
查看>>
JavaEE Bean的两种常用作用域 singleton(单例)和prototype(原型)
查看>>
MySQL 数据库索引
查看>>
JavaEE Spring与MyBatis的整合之传统DAO方式整合(教材学习笔记)
查看>>
JavaEE MyBatis与Spring的整合——基于mapper接口方式开发(教材学习笔记)
查看>>
Omap138开发板下以uboot2012.04.01为例分析uboot执行(五)
查看>>
Omap138开发板下以uboot2012.04.01为例分析uboot执行(六)
查看>>
Omap138开发板下以uboot2012.04.01为例分析uboot执行(七)
查看>>
Omap138开发板下以uboot2012.04.01为例分析uboot执行(八)
查看>>
Java发送邮件 注册成功发送邮件
查看>>
Mybatis的简单使用(增删改查),解决数据库字段名和实体类映射属性名不一致的问题
查看>>