Java内存模型
发布日期:2021-06-30 17:51:25
浏览次数:2
分类:技术文章
本文共 1053 字,大约阅读时间需要 3 分钟。
JAVA内存模型 CPU的运算速度比起内存的访问速度还要快几个量级,为了平衡这个差距,于是就专门为CPU引入了高速缓存,频繁使用的数据放到高速缓存当中,CPU在使用这些数据进行运算的时候就不必再去访问内存。但是在多CPU时代却有一个问题,每个CPU都拥有自己的高速缓存,内存又是所有CPU共享的公共资源,于是内存此时就成了一个临界区,如果控制不好各个CPU对内存的并发访问,那么就会产生错误,出现数据不一致的情况。为了避免这种情况,需要采取缓存一致性协议来保证,这类协议有很多,各个硬件平台和操作系统的实现不尽相同。 JVM需要实现跨平台的支持,它需要有一套自己的同步协议来屏蔽掉各种底层硬件和操作系统的不同,因此就引入了Java内存模型。对于Java来说开发者并不需要关心任何硬件细节,因此没有多核CPU和高速缓存的概念,多核CPU和高速缓存在JVM中对应的是Java语言内置的线程和每个线程所拥有的独立内存空间,Java内存模型所规范的也就是数据在线程自己的独立内存空间和JVM共享内存之间同步的问题。 1、主内存:根据Java Language Specification中的说明, jvm系统中存在一个主内存(Main Memory或Java Heap Memory),Java中所有变量都储存在主存中,对于所有线程都是共享的。 2、工作内存(线程内存或者local memory):每条线程都有自己的工作内存(Working Memory),工作内存中保存的是主存中某些变量的拷贝,线程对所有变量的操作都是在工作内存中进行,线程之间无法相互直接访问,变量传递均需要通过主存完成。 3、内存可见性:因为每个线程有自己的工作内存(线程内存),但一个变量修改之后,该变量在工作内存中改变了,但在主内存中可能还不能立即更新,导致其他线程读取到的还是该变量原来的值。这就存在内存可见性问题。 问题解决: 《1》、可以使用给线程加锁(synchronized也同步内存)。因为: 线程执行互斥代码过程: (1、 获得互斥锁 (2、 清空线程内存 (3、 从主内存中拷贝最新副本到线程内存 (4、 执行代码 (5、 将更改后的变量刷新到主内存 (6、 释放互斥锁 《2》、其次是可以使用volatile关键字:volatile保证可见性的原理是在每次访问变量时都会进行一次刷新,因此每次访问都是主内存中最新的版本。 (除了这个之外,它还能确保变量在线程中的操作不会被重排序而是按照代码中规定的顺序进行访问。 )转载地址:https://liangyihuai.blog.csdn.net/article/details/50670188 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月29日 17时53分56秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Node-Red(一)——简介与安装
2019-04-30
representation learning 表示学习/表征学习
2019-04-30
Haar特征
2019-04-30
Python 之 histogram直方图
2019-04-30
Python 之 Scatter散点图
2019-04-30
Python实现决策树 Desision Tree & 可视化
2019-04-30
决策树 Decision tree
2019-04-30
nominal和ordinal & 数据处理中四种基本数据类型
2019-04-30
Python 实现 Cross-validation
2019-04-30
Grid SearchCV(网格搜索)& Python实现
2019-04-30
ROS相关知识
2019-04-30
单目深度估计 monodepth2模型 代码
2019-04-30
位图索引Bitmap indexes
2019-04-30
YOLO算法(二)—— Yolov2 & yolo9000
2019-04-30
YOLO算法(三)—— Yolov3 & Yolo系列网络优缺点
2019-04-30