我们已经了解了Java虚拟机的运行时数据区,垃圾收集相关知识,接下来学习虚拟机非常重要的部分

这就是Java内存模型与线程(第12章),这一篇,将主要讲讲内存模型

了解Java内存模型之前,先了解下计算机的操作系统的一些已知事实,还是图解先行:

图片没拍好姑且将就着看吧!这是处理器、高速缓存、主内存间的交互关系

计算机的存储设备与处理器的运算速度通常有几个数量级的差距,因此加入了高速缓存来作为中间的缓冲

在多处理器系统中,每个处理器都有自己的高速缓存,他们共享同一主内存,这引入了一个新问题:缓存一致性

内存模型可以理解为在特定的操作协议下,对特定内存或高速缓存读写访问的过程抽象

处理器可能会对输入代码进行"乱序执行优化",保证执行结果与顺序执行结果一致,但是不保证计算顺序与输入代码顺序一致

有了这个大致的理解,接下来我们看看Java内存模型,你将看到它和前面讲到的何其相似,还是先上图:

  Java内存模型的主要目标是定义程序中各个变量的访问规则,即在

虚拟机中将变量存储到内存和从内存中取出变量的底层细节,不同于

通常所说的变量,这里主要是实例字段,静态字段和构成数组的对象

的元素,不包括局部变量与方法参数(因为这是线程私有的)。

规则:线程对变量的所有操作都必须在工作内存中进行,而不能直接

读写主内存中的变量。工作内存中保存了被该线程使用到的变量的主内

存副本拷贝,volatile变量也不例外

接下来介绍下内存间的交互操作

Java内存模型中定义了8种操作来完成工作内存和主内存间的交互,虚拟机必须保证每一种操作都是原子的,不可再分的

作用于主内存的变量的:lock(锁定),unlock(解锁),read(读取),write(写入)

作用于工作内存的变量:load(载入),use(使用),assign(赋值),store(存储)

将变量从主内存复制到工作内存,需要顺序执行read和load操作

将变量从工作内存同步回主内存,需要顺序执行store和write操作

注意:Java内存模型只要求上述两个操作必须顺序执行,而没有保证是连续执行,意即两个操作之间是可以插入其他指令的

如对主内存的变量a和b进行访问,一种可能出现的顺序是read a,read b,load b,load a

Java内存模型还规定了上述8种操作必须满足的其他规则,篇幅所限。此处不再赘述,有兴趣的可参考本书12.3.2节

volatile型变量的特殊规则

关键字volatile可以说是Java虚拟机提供的最轻量级的同步机制

当一个变量定义为volatile后将具备两种特性:

1、保证此变量对所有线程的可见性(也只保证可见性,不保证原子性)。

  可见性指当一条线程修改了该变量的值,新值对于其他线程来说是可以立即得知的。如上所述,普通变量的值

在线程之间传递需要通过主内存来完成。注意:基于volatile变量的运算在并发下一样是不安全的

volatile修饰的变量在赋值后会多执行一个操作,这个操作相当于一个内存屏障,它的作用是使得本CPU的Cache写

入内存,并引起别的CPU或别的内核无效化其Cache,相当于做了一次"strore和write"操作

2、遇到volatile关键字时可以禁止指令重排序优化

  和处理器会进行"乱序执行优化"类似,虚拟机在执行字节码指令过程中也会进行"指令重排序优化",只要保证

执行结果一致,执行顺序并不保证一致。volatile的读操作性能消耗与普通变量几乎无差别,但是写操作可能会慢

一些,因为他需要在本地代码中插入许多内存屏障指令来保证处理器不发生乱序执行

在下一篇我们将学习下内存模型中比较重要的3个概念,原子性,可见性与有序性

JVM系列(三)— Java内存模型的更多相关文章

  1. jvm系列五-java内存模型(2)

    原作者系列文章链接:并发编程系列博客传送门 前言# 在网上看了很多文章,也看了好几本书中关于JMM的介绍,我发现JMM确实是Java中比较难以理解的概念.网上很多文章中关于JMM的介绍要么是照搬了一些 ...

  2. jvm系列五-java内存模型初览(1)

    本文转载自:再有人问你Java内存模型是什么,就把这篇文章发给他. 网上有很多关于Java内存模型的文章,在<深入理解Java虚拟机>和<Java并发编程的艺术>等书中也都有关 ...

  3. 【java多线程系列】java内存模型与指令重排序

    在多线程编程中,需要处理两个最核心的问题,线程之间如何通信及线程之间如何同步,线程之间通信指的是线程之间通过何种机制交换信息,同步指的是如何控制不同线程之间操作发生的相对顺序.很多读者可能会说这还不简 ...

  4. 【JVM.11】Java内存模型与线程

    鲁迅曾经说过“并发处理的广泛应用是使得Amdahl定律代替摩尔定律成为计算机性能发展源动力的根本原因,也是人类‘压榨‘ 计算机运行能力的最有力武器.” 一.概述 多任务处理在现代计算机操作系统中几乎已 ...

  5. JVM的艺术—JAVA内存模型

    *喜欢文章,动动手指点个赞 * 引言 亲爱读者你们好,关于jvm篇章的连载,前面三章讲了类加载器,本篇文章将进入jvm领域的另一个知识点,java内存模型.彻底的了解java内存模型,是有必要的.只要 ...

  6. 【深入理解JVM】:Java内存模型JMM

    多任务和高并发的内存交互 多任务和高并发是衡量一台计算机处理器的能力重要指标之一.一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per Second,TPS)这个指标 ...

  7. 【Java并发系列】--Java内存模型

    Java内存模型 1 基本概念 程序:代码,完成某一个任务的代码序列(静态概念) 进程:程序在某些数据上的一次运行(动态) 线程:一个进程有一个或多个线程组成(占有资源的独立单元) 2 JVM与线程 ...

  8. JVM学习记录-Java内存模型(一)

    前言 Java虚拟机规范中定义了一种Java的内存模型,即Java Memoory Model(简称JMM),用来实现让Java程序在各个平台下都能达到一致的内存访问效果.JVM是整个虚拟机,JMM模 ...

  9. JVM学习记录-Java内存模型(二)

    对于volatile型变量的特殊规则 关键字volatile可以说是Java虚拟机提供的最轻量级的同步机制. 在处理多线程数据竞争问题时,不仅仅是可以使用synchronized关键字来实现,使用vo ...

  10. jvm系列(三):java GC算法 垃圾收集器

    GC算法 垃圾收集器 概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计 ...

随机推荐

  1. Webstorm 、ECMAScript 6 、AngularJS

    突然接到一智障询问以上内容,大发善心总结(其实就是CV大法)一下下,希望能帮助某智障.....上干活! WebStorm 刚看到我是懵逼的,但是看到和其他两个在一起,猜想到是前台的一开始以为是前台框架 ...

  2. WPF 模仿 UltraEdit 文件查看器系列一 用户控件

    WPF 模仿 UltraEdit 文件查看器系列一 用户控件 运行环境:Win10 x64, NetFrameWork 4.8, 作者:乌龙哈里,日期:2019-05-10 章节: 起步 添加用户控件 ...

  3. java-----Long转换为 int , string

    int: 1.调用intValue()方法 long ll = 300000; int ii= new Long(ll).intValue(); 2.先把long转换成字符串String,然后在转行成 ...

  4. Linux基本使用命令

    一.常用命令归纳分类 课外网站  http://man.linuxde.net/               http://www.jb51.net/linux/               http ...

  5. NX二次开发-UFUN输入表达式TAG,得到表达式字符串UF_MODL_ask_exp_tag_string

    NX9+VS2012 #include <uf.h> #include <uf_modl.h> UF_initialize(); //创建表达式 tag_t NewExpTag ...

  6. CSS 圣杯布局

    前端的两个经典布局想必大家都有多了解--圣杯布局和双飞翼布局,因为它既能体现你懂HTML结构又能体现出你对DIV+CSS布局的掌握. 事实上,圣杯布局其实和双飞翼布局是一回事.它们实现的都是三栏布局, ...

  7. Core Text 入门

    本文所涉及的代码你可以在这里下载到 https://github.com/kejinlu/CTTest,包含两个项目,一个Mac的NSTextView的测试项目,一个iOS的Core Text的测试项 ...

  8. Django中的HttpResponse和JsonResponse

    Django中的HttpResponse和JsonResponse 我们在编写一些借口函数的时候,经常需要给调用者返回json格式的数据,那么如何返回可直接解析的数据呢? 首先第一种方式: from ...

  9. html清除浮动的6种方法示例

    使用display:inline-block会出现的情况: 1.使块元素在一行显示2.使内嵌支持宽高3.换行被解析了4.不设置的时候宽度由内容撑开5.在IE6,7下步支持块标签 由于inline-bl ...

  10. tushare使用教程:初始化调用PRO版数据示例

    下面介绍两种常用的数据调取方式: 通过tushare python包 使用http协议直接获取 注:pro版数据接口采用语言无关的http协议实现,但也提供了多种语言的SDK数据获取. 前提条件 1. ...