最近因为小组的分享的缘故,细看了一下JAVA内存模型,猛地发现原来我一直认为应该怎么样怎么样的事情,和实时是不符合的,接下来简单的记录一下最近的感悟。
在JVM 1.2之前,Java的内存模型实现总是直接操作主内存的,多线程的时候访问效率比较低下。目前的JVM,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不直接在主存中进行读写,这样提高了访问效率。但造成一个结果就是如果一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,就产生了数据的不一致。
VM系统中存在一个主内存叫:main memory,JAVA中所有的变量都是存储在这里的,所有变量共享一块内存。每个线程有自己的工作内存,叫:working memory,用来存储各个线程从main memory中的变量的拷贝。线程的所有对变量的操作都是在working memory中完成的,完成后,修改的数据会刷到main memory中。整个结构图如下:
线程之间的通信也是通过于主内存交互完成的(线程本身不进行通信)
重排序
为什么要重排序:CPU 的主频越来越高,与 cache 的交互次数也越来越多。当 CPU 的计算速度远远超过访问 cache 时,会产生 cache wait ,过多的 cache wait 就会造成性能瓶颈
解决的方式:将cache分片,即将一块 cache 划分成互不关联地多个 slots ( 逻辑存储单元,又名 Memory Bank 或 Cache Bank) , CPU 可以自行选择在多个 idle bank 中进行存取。这种 SMP 的设计,显著提高了 CPU 的并行处理能力,也回避了 cache 访问瓶颈。
举个例子:a=1;b=2;
理想情况下,执行的顺序应该是:
cpu0->写入a=1到cache1中//A
cpu0->写入b=2到cache2中//B
如果cache1状态为忙碌的时候,cache0则需要等待
如果做过重排序的话就可以先执行B过程,这样就不会有cache wait,性能在这块就好有很好的保证
数据依赖性:如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。如下面:
写后读,读后写,写后写
这三种情况只要重排后,程序的执行结果将会改变,所有编译器是不会对这几种情况进行重排序的
说到底重排序遵循的规则就是:不管怎么排序,程序的执行结果不会改变(这正是as-if-serial的语义)
happen-before
语义:如果A行为发生于B行为之前,那么B行为对A行为可见
遵循的规则:
程序顺序规则:一个线程中的每个操作,happens- before 于该线程中的任意后续操作。
监视器锁规则:对一个监视器锁的解锁,happens- before 于随后对这个监视器锁的加锁。
volatile变量规则:对一个volatile域的写,happens- before 于任意后续对这个volatile域的读。
传递性:如果A happens- before B,且B happens- before C,那么A happens- before C。
分享到:
相关推荐
9--[小黑点的旅行(未完待续)].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码9--[小黑点的旅行(未完待续)].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码9--[小黑点的旅行(未完待续)].zip...
"android播放器未完待续"这个标题暗示我们将探讨如何在Android系统中构建一个功能完善的音乐播放器,以及可能遇到的问题和解决方案。让我们深入研究一下。 首先,Android音乐播放器的基础是媒体库服务。Android提供...
scratch2源码小黑点的旅行(未完待续)提取方式是百度网盘分享地址
EOS开发入门之cleos命令解读(未完待续)1
【标题】:“个人手机网游作品展示,未完待续” 这个标题揭示了这是一个关于个人制作的手机网络游戏的展示,暗示作者可能是一名独立游戏开发者,或者是对游戏开发有浓厚兴趣的爱好者。"未完待续"则表明这项作品还在...
教程名称:linux服务器性能调优文档(未完待续)课程目录:linux服务器性能调优01linux服务器性能调优02linux服务器性能调优03linux服务器性能调优04linux服务器性能调优05linux服务器性能调优06linux服务器性能调优07...
在大数据实战第一部分中,我们将探索大数据处理的关键概念和技术,这些技术在当今信息化社会中扮演着至关重要的角色。...通过这个未完待续的大数据实战项目,你将深入理解大数据处理的全貌,并获得宝贵的实践经验。
《Web前端入门_从零开始做网站》讲义(未完待续).pdf
标题"A股市场策略周报:跨年行情,不要犹豫,未完待续.zip"揭示了这是关于中国A股市场的每周投资策略报告,重点在于跨年度的股市趋势分析。"跨年行情"指的是跨越不同年度的股市表现,通常投资者关注此阶段的市场动态...
在内存管理方面,C++程序执行时会将其加载到内存中,内存被划分为不同的区域: - **栈区**:存放函数调用时的局部变量,栈遵循LIFO(后进先出)原则,自动管理内存。 - **全局变量和静态变量区**:存储全局变量和...
北京理工大学<Python机器学习应用>超详细学习笔记和代码注释(未完待续)
汽车行业:乘风破浪的重卡市场,高景气度未完待续-基于国三存量数据的重卡销量测算
10. **模型保存与加载**:训练完成后,可以使用PyTorch的`torch.save()`方法保存模型的权重和结构,之后可以随时加载模型进行预测或继续训练。 在`Untitled.ipynb`这个Jupyter Notebook文件中,可能包含了实现这些...
汽车行业:乘风破浪的重卡市场,高景气度未完待续-基于国三存量数据的重卡销量测算.pdf
解决调度问题的元启发式算法应用(未完待续...),蚁群算法(ACO)、遗传算法(GA)、粒子群算法(_Scheduling-problems
10. 青春的延续:尽管青春已逝,但它的精神和影响却可以"未完待续",持续影响着我们的生活和决策。 总结,本文通过对青春的描绘,探讨了时间、成长、分别、记忆、诺言等主题,展现了青春的美好、脆弱和短暂,同时也...
... **集成组件** ... ...这通常需要PDO_OCI或oci8扩展。...2. **Redis** - Redis是一个高性能的键值存储系统,常用于缓存和数据...虽然这个探针的描述标记为"未完待续,仅供参考",但它仍能为PHP开发者带来宝贵的环境调试信息。
2012年12月21-22日,由杭州安恒信息技术有限公司与人人网联合主办2012(首届)互联网安全高峰论坛成功举办,本届高峰论坛的主题为“末日安全 & 人人安恒”。本届论坛主要内容将围绕WEB应用防护的技术体系建设和产品...
"乘风破浪的重卡市场,高景气度未完待续-基于国三存量数据的重卡销量测算"这一标题揭示了当前重卡市场的繁荣状态以及对未来趋势的预期。以下是对这个主题的详细分析: 首先,我们需要理解“国三”标准是指国家第三...