Java内存模型
发布日期:2021-06-30 17:51:25 浏览次数:3 分类:技术文章

本文共 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:指令重排序
下一篇:Android activity的生命周期

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年04月25日 05时44分41秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章