JMM是什么?

  JMM 全称 Java memory model ,直译过来就是Java内存模型,这里注意了,指到并不是JVM中的内存分布新生代、老年代、永久代这些,当然也不是 程序计数器(PC)、java虚拟机栈、本地方法栈、java堆、方法区。

那么它到底是什么呢?

内存模型

  简单来说,JMM定义了线程和主内存之间的抽象关系 ,说到内存模型,我们可以顺便了解一下其他的内存模型 ,顺序一致性模型(理论模型),处理器的内存模型。(从另一个角度看JMM屏蔽了不同处理器内存模型的差异)

  回到正题,要说清楚线程和主内存之间的抽象关系,先从线程的主要两个问题说起,如何通信和何时同步。

如何通信

如何通信指的是,线程之间用何种机制来交换信息, 现在存在的有两种,一种是隐式共享内存,另一种是通过显示发送消息。这里JMM使用的第一种(会存在本地写缓冲区和共享内存可见性问题),具体的实现可以看下图。

(好了你别说了,我是图)

何时同步

  何时同步指的是,线程之间控制发生相对顺序的机制,为什么需要控制相对顺序的机制呢?(还记得我们上面说的顺序一致性模型吗,自行了解一下),这里主要是一种叫重排序的东西存在。

重排序

  你或许又会说重排序是干嘛的,对我们有什么影响,这里简单的说,就是程序可能不会按照我们预期的方式执行,在单线程的情况下还好(因为有依赖保证、和as-if-serial),但在多线程但情况下就会出现各种奇奇怪怪的问题啦。

  我们都知道,从java代码,经过编译成为.class字节码文件,再由不同平台jvm解析成为机器语言(java并不是解释型语言啊,JIT即时编译、Aot什么的)。 在这个过程中 编译器呀,处理器呀,内存模型啊,为了性能,在保证可靠性的前提下,会进行重排序。

  那么为了让程序如我们所预期的方式执行,我们可以通过使用同步机制来完成。(如sync,lock,volatile,后面会稍微详细说说这几个的内存语义,映射到底层处理器其实就是使用内存屏障来防止重排序)

volatile语义

锁的内存语义

面向程序员和处理器编译器的happens-before

这些后面再说了orz,好了,mac没电了不说了



聊聊JMM的更多相关文章

  1. 聊聊CPU的LOCK指令

    本文转载自聊聊CPU的LOCK指令 导语 在多线程操作中,可能最经常被提起的就是数据的可见性.原子性.有序性.不管是硬件方面.软件方面都在这三方面做了很足的工作,才能保证程序的正常运行. 之前发表过一 ...

  2. (五)JMM的介绍

    1. JMM的介绍 在上一篇文章中总结了线程的状态转换和一些基本操作,对多线程已经有一点基本的认识了,如果多线程编程只有这么简单,那我们就不必费劲周折的去学习它了.在多线程中稍微不注意就会出现线程安全 ...

  3. Java并发(3)- 聊聊Volatile

    引言 谈到volatile关键字,大多数开发者都有一定了解,可以说是开发者非常熟悉,深入之后又非常陌生的一个关键字.相当于轻量的synchronized,也叫轻量级锁,与synchronized相比性 ...

  4. Java内存模型(Java Memory Model,JMM)

    今天简单聊聊什么叫做 Java 内存模型,不是 JVM 内存结构哦. JMM 是一个语言级别的内存模型,处理器的硬件模型是硬件级别,Java中的内存模型是内存可见性的基本保证.从而为我们 volati ...

  5. 聊聊高并发(十八)理解AtomicXXX.lazySet方法

    看过java.util.concurrent.atomic包里面各个AtomicXXX类实现的同学应该见过lazySet方法.比方AtomicBoolean类的lazySet方法 public fin ...

  6. 每日三道面试题,通往自由的道路10——JMM篇

    茫茫人海千千万万,感谢这一秒你看到这里.希望我的面试题系列能对你的有所帮助!共勉! 愿你在未来的日子,保持热爱,奔赴山海! 每日三道面试题,成就更好自我 今天我们还是继续聊聊多线程的一些其他话题吧! ...

  7. 聊聊Unity项目管理的那些事:Git-flow和Unity

    0x00 前言 目前所在的团队实行敏捷开发已经有了一段时间了.敏捷开发中重要的一个话题便是如何对项目进行恰当的版本管理.项目从最初使用svn到之后的Git One Track策略再到现在的GitFlo ...

  8. Mono为何能跨平台?聊聊CIL(MSIL)

    前言: 其实小匹夫在U3D的开发中一直对U3D的跨平台能力很好奇.到底是什么原理使得U3D可以跨平台呢?后来发现了Mono的作用,并进一步了解到了CIL的存在.所以,作为一个对Unity3D跨平台能力 ...

  9. fir.im Weekly - 聊聊 Google 开发者大会

    中国互联网的三大错觉:索尼倒闭,诺基亚崛起,谷歌重返中国.12月8日,2016 Google 开发者大会正式发布了Google Developers 中国网站 ,包含了Android Develope ...

随机推荐

  1. Firebird Embedded 部署的一个坑

    今天把旧程序升级了,把DBX组件换成了FireDac组件,在虚拟机里测试的时候,一直报上图中的错误,但是在主机上运行无问题,之前用户使用也一直没报过这个错. 折腾了又折腾,还是搞不定,感觉脑袋有点大了 ...

  2. AutoCAD神器! AutoCAD自动切换中英文输入法插件(ZDSRF)

    AutoCAD神器! AutoCAD自动切换中英文输入法插件 (一)功能特点: CAD命令中只能输入英文字符,不能输入中文,在文字编辑.文字输入.尺寸编辑中经常需要输入中文,此时就需要频繁的切换输入法 ...

  3. 自定义页面微信、微博、QQ分享效果

    几行简单的分享代码既可以实现,先看下效果: 第一步:页面因为结构代码 <div id="freebtn"> <ul> <li class=" ...

  4. OpenResty的现状、趋势、使用及学习方法

    Nginx 是俄罗斯人发明的, Lua 是巴西几个教授发明的,中国人章亦春把 LuaJIT VM 嵌入到 Nginx 中,实现了 OpenResty 这个高性能服务端解决方案. 通过 OpenRest ...

  5. js 数组 map方法

    https://www.cnblogs.com/xuan52rock/p/4460949.html https://jingyan.baidu.com/article/91f5db1b7453471c ...

  6. Linux安装/升级pip

    Linux安装/升级pip 1.执行脚本 # wget https://bootstrap.pypa.io/get-pip.py # 如果没有 wget,先安装 wget # yum -y insta ...

  7. 使用原生JDBC循环读取文件并持久化到数据库

    先上代码: package com.demo.common.service; import java.io.File; import java.io.FileInputStream; import j ...

  8. Java邮件发送

    Java中发送邮件的方法之一,需要用到spring框架集成的JavaMailSenderImpl.SimpleMailMessage两个实现类. 一,创建一个service,代码如下: public ...

  9. altera DDR2 IP核之仿真

    在生成的IP核文件夹下,有一个testbench文件夹,里面包含了一个example测试激励和DDR2仿真模型. 如下 20 -rw-r--r-- 1 Administrator 197121 171 ...

  10. Java 公平锁与非公平锁学习研究

    最近学习研究了一下Java中关于公平锁与非公平锁的底层实现原理,总结了一下. 首先呢,通过其字面意思,公平与非公平的评判标准就是付出与收获成正比(和社会中的含义差不多一个意思).放到程序中,尤其是 在 ...