Java内存模型

java内存模型(Java Memory Model,JMM)是java虚拟机规范定义的,用来屏蔽掉java程序在各种不同的硬件和操作系统对内存的访问的差异,这样就可以实现java程序在各种不同的平台上都能达到内存访问的一致性。可以避免像c++等直接使用物理硬件和操作系统的内存模型在不同操作系统和硬件平台下表现不同,比如有些c/c++程序可能在windows平台运行正常,而在linux平台却运行有问题。

MESI缓存协议

CPU高速缓存(Cache Memory)

CPU为何要有高速缓存?

CPU在摩尔定律的指导下以每18个月翻一番的速度在发展,然而内存和硬盘的发展速度远远不及CPU。这就造成了高性能能的内存和硬盘价格及其昂贵。然而CPU的高度运算需要高速的数据。为了解决这个问题,CPU厂商在CPU中内置了少量的高速缓存以解决I\O速度和CPU运算速度之间的不匹配问题。

在CPU访问存储设备时,无论是存取数据抑或存取指令,都趋于聚集在一片连续的区域中,这就被称为局部性原理

* 时间局部性(Temporal Locality):如果一个信息项正在被访问,那么在近期它很可能还会被再次访问。比如循环、递归、方法的反复调用等。

* 空间局部性(Spatial Locality):如果一个存储器的位置被引用,那么将来他附近的位置也会被引用。比如顺序执行的代码、连续创建的两个对象、数组等。
带有高速缓存的CPU执行计算的流程
1.程序以及数据被加载到主内存

2.指令和数据被加载到CPU的高速缓存

3.CPU执行指令,把结果写到高速缓存

4.高速缓存中的数据写回主内存

多核CPU多级缓存一致性协议MESI

多核CPU的情况下有多个一级缓存,如何保证缓存内部数据的一致,不让系统数据混乱。这里就引出了一个一致性的协议MESI。如下图:

处理器、高数缓存、主内存之间遵循一致性的协议交互关系.png
MESI协议缓存状态

缓存行(Cache line):缓存存储数据的单元
1.M修改,该Cache line有效,数据被修改了,和内存中的数据不一致,数据只存在于本Cache中
2.E独占,该Cache line有效,数据和内存中的数据一致,数据只存在于本Cache中。
3.S共享,该Cache line有效,数据和内存中的数据一致,数据存在于很多Cache中。
4.I无效,该Cache line无效。

JMM-8大原子操作

物理机高速缓存和主内存之间的交互有协议,同样的,java内存中线程的工作内存和主内存的交互是由java虚拟机定义了如下的8种操作来完成的,每种操作必须是原子性的。java虚拟机中主内存和工作内存交互,就是一个变量如何从主内存传输到工作内存中,如何把修改后的变量从工作内存同步回主内存。

1.lock (锁定):作用于主内存的变量,把一个变量标记为一条线程独占状态
2.unlock (解锁):作用于主内存的变量,把一个处于锁定状态的变量释放出来,释放后变量才可以被其他线程锁定
3.read (读取):把一个变量值从主存传输到线程的工作内存中,以便随后的load动作使用
4.load (载入):它把read操作从主内存中得到的变量值放入工作的变量副本中
5.use (使用):把工作内存中的一个变量值传递给执行引擎
6.assign赋值):它把一个从执行引擎接收到的值赋给工作内存中的变量
7.store存储):把工作内存中的一个变量的值传送到主存中
8.write写入):把store操作从工作内存中的一个变量的值传送到主内存的变量中

假设执行以下代码:

     var flag = false
    //线程1
     Thread {
        if (flag) {......}
    }
    //线程2
    Thread {
        flag = true
    }

以线程2为例,具体步骤:

1、执行read操作,将数据从主内存传输到线程的工作内存

2、执行load操作,主内存中得到的变量值放入工作内存的变量副本中

3、执行use操作,工作内存中的变量值传递给执行引擎

4、执行assign操作,把从执行引擎接收到的值赋给工作内存中的变量

5、执行store操作,把工作内存中的变量的值传送到主存中

6、执行write操作,把store操作从工作内存中传送的变量值更新主内存的变量中

如下图:


JMM原子操作示例.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259

推荐阅读更多精彩内容

  • JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式。JVM是整个计算机虚拟模型,所以JMM是...
    JavaM阅读 1,356评论 0 4
  • 一、现代计算机内存模型 早期的计算机中由于CPU和内存的速度是差不多的,所以CPU是直接访问内存地址的。而在现代计...
    周二鸭阅读 334评论 1 2
  • 1. 缓存一致性问题 在我们学习java内存模型之前,先来了解一下多核硬件架构。 我们都知道计算执行程序实际上是c...
    tracy_668阅读 586评论 0 2
  • 1. 缓存一致性 计算机并发执行若干任务,需要与内存交互。计算机存储设备处理速度与处理器处理速度有着量级的差距,所...
    sizuoyi00阅读 331评论 0 0
  • 在了解Java内存模型之前,先来看一下多核硬件架构。 我们应该都知道,计算机在执行程序的时候,每条指令都是在CPU...
    消失er阅读 1,649评论 0 5