JMM导读_jmm是什么意思

JMM导读_jmm是什么意思JMM优秀文章导读。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一. volatile

理解volatile特性的一个好方法是:把对volatile变量的单个读/写,看成是使用同一个锁对这些单个读/写操作做了同步。

前文提到过,x86处理器仅会对写-读操作做重排序。X86不会对读-读,读-写和写-写操作做重排序,因此在x86处理器中会省略掉这三种操作类型对应的内存屏障。在x86中,JMM仅需在volatile写后面插入一个StoreLoad屏障即可正确实现volatile写-读的内存语义。这意味着在x86处理器中,volatile写的开销比volatile读的开销会大很多(因为执行StoreLoad屏障开销会比较大)。

二. 锁

当线程释放锁时,JMM会把该线程对应的本地内存中的共享变量刷新到主内存中;当线程获取锁时,JMM会把该线程对应的本地内存置为无效。从而使得被监视器保护的临界区代码必须要从主内存中去读取共享变量。

对比锁释放-获取的内存语义与volatile写-读的内存语义,可以看出:锁释放与volatile写有相同的内存语义;锁获取与volatile读有相同的内存语义。

下面对锁释放和锁获取的内存语义做个总结:

  •  线程A释放一个锁,实质上是线程A向接下来将要获取这个锁的某个线程发出了(线程A对共享变量所做修改的)消息。
  • 线程B获取一个锁,实质上是线程B接收了之前某个线程发出的(在释放这个锁之前对共享变量所做修改的)消息。
  • 线程A释放锁,随后线程B获取这个锁,这个过程实质上是线程A通过主内存向线程B发送消息。

二. JMM

  1. 深入理解java内存模型(一)——基础
  2. 深入理解java内存模型(二)——重排序
  3. 深入理解java内存模型(三)——顺序一致性
  4. 深入理解java内存模型(四)——volatile
  5. 深入理解java内存模型(五)——锁
  6. 深入理解java内存模型(六)——final
  7. 深入理解java内存模型(七)——总结

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197094.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 利用ffmpeg制作gif图[通俗易懂]

    利用ffmpeg制作gif图[通俗易懂]由于老师安排的作业有需求,这里就记录一下利用ffmpeg制作gif图1.确保ffmpeg安装运行会显示版本号:ffmpeg-version没有安装的话先安装:sudoapt-repositoryppa:kirillshkrogalev/ffmpeg-nextsudoapt-getupdatesudoapt-getinstallffmpegffmpeg-ve…

    2025年6月26日
    2
  • 关于ip地址 :局域网 广域网 ip 公网 私网 ipv6 ipv4的区别、hosts文件和DNS域名解析说明

    关于ip地址 :局域网 广域网 ip 公网 私网 ipv6 ipv4的区别、hosts文件和DNS域名解析说明1.ip地址说明1.1网络基本知识说明(局域网/广域网/ip地址)场景分析:假如只有一台电脑,那么这台电脑的数据只会全部储存在此电脑的硬盘上,与其它的电脑不会产生任何关系,但是一台电脑干的事情比较少,往往需要多台电脑协同办公提高效率。问题1:多台电脑协同工作势必产生数据交互,如何进行数据交互呢???解决1:可以使用u盘之类的移动存储介质拷贝数据(缺点:需要手动的进行操作、无法做到数据的实时传输)解决2:使用线缆把2台电脑连接起来,通过这根线缆进行传输数据,这根线缆就叫做网线。如下图所示。问

    2022年10月18日
    2
  • jvm类的加载机制_java类加载流程及原理

    jvm类的加载机制_java类加载流程及原理1.类加载器的组织结构转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52301541类加载器ClassLoader是具有层次结构的,也就是父子关系。其中,Bootstrap是所有类加载器的父亲。(1)Bootstrapclassloader:启动类加载器当运行Java虚拟机时,这个类加载器被创建,…

    2022年8月11日
    7
  • 谷歌与火狐Hackbar插件下载与安装

    谷歌与火狐Hackbar插件下载与安装谷歌与火狐Hackbar插件下载与安装首先下载Hackbar插件:https://github.com/Mr-xn/hackbar2.1.3将其中的压缩包拖拽到Chrome的扩展程序。点击详细信息在下面的“来源”处点击一个链接:会跳转到给插件在Chrome中安装的文件位置,打开hackbar-panel.js文件将三处disable_hackbar()函数替换成init(),保…

    2022年5月26日
    102
  • MDK(keil)工具:如何使用MDK生成bin文件「建议收藏」

    MDK(keil)工具:如何使用MDK生成bin文件「建议收藏」在给开发板烧写程序时,有时候我们会用到bin文件,在使用MDK开发时,我们可以在魔法棒配置->output选项中看到生成hex文件的选项卡,图中标号1所示位置如果需要生成bin文件,就需要我们自己配置,配置方法如下,首先在魔术棒中找到User选项卡,并按照下图所示输入命令fromelf.exe–bin–output”@L.bin””#L”生成的文件名在图一中的红色标号2处设置。…

    2022年10月20日
    2
  • django formview_django queryset合并

    django formview_django queryset合并APIView视图类在DRF中,推荐使用类视图,因为类视图可以通过继承的方式把一些重复性的工作抽取出来,而使得代码更加简洁。当然如果你不想使用类视图,那么就用@api_view装饰器包裹一下就可以。

    2022年8月7日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号