聊聊JMM
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的更多相关文章
- 聊聊CPU的LOCK指令
本文转载自聊聊CPU的LOCK指令 导语 在多线程操作中,可能最经常被提起的就是数据的可见性.原子性.有序性.不管是硬件方面.软件方面都在这三方面做了很足的工作,才能保证程序的正常运行. 之前发表过一 ...
- (五)JMM的介绍
1. JMM的介绍 在上一篇文章中总结了线程的状态转换和一些基本操作,对多线程已经有一点基本的认识了,如果多线程编程只有这么简单,那我们就不必费劲周折的去学习它了.在多线程中稍微不注意就会出现线程安全 ...
- Java并发(3)- 聊聊Volatile
引言 谈到volatile关键字,大多数开发者都有一定了解,可以说是开发者非常熟悉,深入之后又非常陌生的一个关键字.相当于轻量的synchronized,也叫轻量级锁,与synchronized相比性 ...
- Java内存模型(Java Memory Model,JMM)
今天简单聊聊什么叫做 Java 内存模型,不是 JVM 内存结构哦. JMM 是一个语言级别的内存模型,处理器的硬件模型是硬件级别,Java中的内存模型是内存可见性的基本保证.从而为我们 volati ...
- 聊聊高并发(十八)理解AtomicXXX.lazySet方法
看过java.util.concurrent.atomic包里面各个AtomicXXX类实现的同学应该见过lazySet方法.比方AtomicBoolean类的lazySet方法 public fin ...
- 每日三道面试题,通往自由的道路10——JMM篇
茫茫人海千千万万,感谢这一秒你看到这里.希望我的面试题系列能对你的有所帮助!共勉! 愿你在未来的日子,保持热爱,奔赴山海! 每日三道面试题,成就更好自我 今天我们还是继续聊聊多线程的一些其他话题吧! ...
- 聊聊Unity项目管理的那些事:Git-flow和Unity
0x00 前言 目前所在的团队实行敏捷开发已经有了一段时间了.敏捷开发中重要的一个话题便是如何对项目进行恰当的版本管理.项目从最初使用svn到之后的Git One Track策略再到现在的GitFlo ...
- Mono为何能跨平台?聊聊CIL(MSIL)
前言: 其实小匹夫在U3D的开发中一直对U3D的跨平台能力很好奇.到底是什么原理使得U3D可以跨平台呢?后来发现了Mono的作用,并进一步了解到了CIL的存在.所以,作为一个对Unity3D跨平台能力 ...
- fir.im Weekly - 聊聊 Google 开发者大会
中国互联网的三大错觉:索尼倒闭,诺基亚崛起,谷歌重返中国.12月8日,2016 Google 开发者大会正式发布了Google Developers 中国网站 ,包含了Android Develope ...
随机推荐
- delphi 多线程之System.TMonitor
三天不写代码就手生! 把测试代码记录下来. unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, S ...
- python安装media报错
Try https://pypi.python.org/pypi/setuptools easy_install LEE 我后来,依次在Python2.7中装了 numpy-1.7.0-win32-s ...
- 关于C6678的网口问题
1.C6678 Keystone1架构的GbE switch subsystem如图所示: 2.从图中可以看到MAC层与物理层PHY芯片的连接接口是由SGMII+SerDES构成,SGMII是以太网M ...
- Azure CosmosDB (13) CosmosDB数据建模
<Windows Azure Platform 系列文章目录> 我们在使用NoSQL的时候,如Azure Cosmos DB,可以非常快速的查询非结构化,或半结构化的数据.我们需要花一些时 ...
- 从已删除邮箱copy数据到活动邮箱
Start Windows PowerShell Start > search for "PowerShell" > Start Windows PowerShell ...
- DockerToolbox在Win7上的安装和设置
为什么使用Docker Toolbox Docker在Windows上使用有两种方式,一是利用VirtualBox建立linux虚拟机,在linux虚拟机中安装docker服务端和客户端,二是利用Wi ...
- C#-记录一些常见的语法特性
C#6.0的一些语法 一.Lambda表达式的一些运用 1.在属性.方法中应用 例如常规对属性的赋值: public bool IsNavigation { get { return this._na ...
- Kubernetes生态工具
Helm Helm 是 Kubernetes 的包管理器,它是查找.共享和使用为 Kubernetes 开发的软件的最佳方式.Helm Charts 可用于定义.安装和升级复杂的 Kubernetes ...
- Servlet-Context学习笔记
介绍 ServletContext其实就是全局作用域对象, 上下文环境对象 利用context可以实现对,当前网站中所有的Servlet共享数据 context对象只能由Tomcat负责创建,在tom ...
- 03-自己封装DateUtil工具类
package com.utils; import java.text.ParseException; import java.text.SimpleDateFormat; import java.u ...