【真正的JAVA内存模型---翻译自Java语言规范】

Java 内存模型

JSR133中文版

JAVA语言规范-17.4节

1. 什么是内存模型

  • 给定一个程序和该程序的一串执行轨迹,内存模型描述了该执行轨迹是否是该程序的一次合法执行。对于Java,内存模型检查执行轨迹中的每次读操作,然后根据特
    定规则,检验该读操作观察到的写是否合法。
  • 内存模型的一个高级、非正式的概述显示其是一组规则,规定了一个线程的写操作何时会对另一个线程可见。

2. Java内存模型

  • 需要了解Java程序内存模型需要先知道其他相关的内存模型

顺序一致内存模型

  1. 每个对变量 v 的读操作 r 都将看到写操作 w 写入 v 的值,只要:
  • 执行顺序上 w 在 r 之前,且
  • 执行顺序上不存在这样一个 w’,w 在 w’之前且 w’在 r 之前。
  1. 简单理解就是按照程序执行顺序,任何一个写操作先执行,在另外一个线程都能够实时读取

Happens-Before内存模型

在顺序一致内存模型的基础上增加一些规则。规则主要分为两类,一类同步规则,一类传递规则

同步边(synchronizes-with edge)
同步边定义:
  1. 对象头的解锁一定要先于对对象头的加锁
    monitorexit指令一定要先于monitorenter指令
  2. 同一个volatile变量,写该变量一定要先于该变量的读动作
  3. thread.start()方法一定先于该线程中的第一个动作
  4. 线程内部变量的初始化一定要先于该线程内的第一个动作
  5. 线程T1的最后一个工作一定要先于线程T2的检测T1结束动作。检测结束动作包括t1.alive()和t1.join()
  6. 线程T1打断线程T2,打断T2的动作一定先于所有线程内(包括T2)检测T2被打断的动作;检测动作包含抛异常interuptException以及thrad.isInterupt()
同步边最小子集
  1. unlock一定先于lock
  2. volatile变量的写一定先于volatile变量的读
  3. thread.start()一定先于thread内的任何动作
  4. thread内的所有动作一定先于thread.join()的线程执行内容
  5. object的对象初始化一定先于对对象的任意操作(除了给object的变量设置初始值)

在java语言规范中说的以上6点叫做同步关系边(synchronised-with edg),根据我个人的理解是如下图
在这里插入图片描述

同步边的源端叫做一个release,目标端的操作可以叫做acquire

先发生边 (hanppens-before edge)
  1. 如果同一个线程中,x代码编写先于y.可以说x happens-before y 符号表示为hb(x,y)
  2. 对象的构造函数 happens-before对这个对象调用finalizer()函数
  3. 如果动作a 同步边 动作b,则一定存在hb(a,b)
  4. 如果hb(a,b) hb(b,c) 则一定有hb(a,c)
    拥有happens-before不一定就不能排序,只要指令重排之后的结果是一个合法的执行结果
    执行顺序满足 happens-before edg交易hanppens-before内存模型
值凭空产生

Java内存模型就是happens-bofore的补充版。补充了happens-before的缺陷。即满足java内存模型一定满足happens-before规则,反之则不一定

hanppends-before的缺点–值凭空产生

如何理解值凭空产生

初始值 x=y=0
T1                  T2
r1 = x;         r2 = y;
if (r1 != 0)     if (r2 != 0)
y = 1;          x = 1;

程序员编程,输入x,y=0则理想结果应该为r1=r2=0;
按照happens-before规则可能的结果为:r1=r2=1.由于以上程序不存在同步规则,底层可以任意调整指令顺序,只要满足单线程执行结果即可。

如下为指令调整内容:编译器假设x=1,T2 则y=1的时候x必然=1.因此之后的观察结果将证明x = 1的初始观察结果是合理的,这是循环推理。如果这是真的,那么x = y = 1将是一个合法的结果,JVM可以简单地替换两个线程中的代码来编写每个值

happens-before关系的定义只适用于显式同步的程序,不会禁止假设的循环推理,因此JMM显式提出了这个因果关系限制

所以JMM = happens-before + 禁止值凭空产生

Java内存模型规范

//TODO
原文用公式理论详细描述了规范内容详情见JSR-133第7张,实在是看不懂,等大佬带飞

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值