我们已经了解了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个概念,原子性,可见性与有序性

转载于:https://www.cnblogs.com/yb38156/p/9427181.html

JVM系列(三)— Java内存模型相关推荐

  1. 无招胜有招之Java进阶JVM(三)内存模型

    为什么要有内存模型 在介绍Java内存模型之前,先来看一下到底什么是计算机内存模型,然后再来看Java内存模型在计算机内存模型的基础上做了哪些事情.要说计算机的内存模型,就要说一下一段古老的历史,看一 ...

  2. java的jmm模型_【深入理解JVM】:Java内存模型JMM

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

  3. Java内存结构(JVM)、Java内存模型(JMM)、Java对象模型区别

    目录 一.JAVA内存结构 1.1 JVM启动流程: 1.2 JVM基本结构 1.2.1基本结构图 1.2.2 Java中的内存分配 二.Java内存模型 2.1 主内存和工作内存 2.2 内存间交互 ...

  4. jvm面试之 Java内存模型之线程独占部分,线程共享部分,常问问题分析

    Java内存模型之线程独占部分 Java内存模型之线程共享部分 Java内存模型之常问问题分析

  5. 深入探索JVM高效并发 — Java内存模型(四) 先行发生原则

    先行发生原则 Java语言中有一个"先行发生"(Happens-Before)的原则.这个原则非常重要,它是判断数据是否存在竞争,线程是否安全的非常有用的手段. 依赖这个原则,我们 ...

  6. 【深入Java虚拟机JVM 03】Java内存模型

    说明:文章所有内容均摘自<深入理解Java虚拟机:JVM高级特性与最佳实践(第二版)> Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的"高墙",墙外面的 ...

  7. 【JVM】JVM08(java内存模型解析[JMM])

    ⭐️写在前面 这里是温文艾尔の学习之路

  8. Java虚拟机(JVM)与Java内存模型(JMM)学习笔记

    Java虚拟机[JVM]与Java内存模型[JMM]学习笔记 Java虚拟机(JVM) 三种JVM JVM 位置 JVM的主要组成部分及其作用 类加载器 双亲委派机制 沙箱安全机制 Java本地接口( ...

  9. java if在内存中_全面理解Java内存模型

    Java 内存模型的抽象 在 java 中,所有实例域.静态域和数组元素存储在堆内存中,堆内存在线程之间共享(本文使用"共享变量"这个术语代指实例域,静态域和数组元素).局部变量( ...

  10. 全面理解Java内存模型

    Java内存模型即Java Memory Model,简称JMM.JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式.JVM是整个计算机虚拟模型,所以JMM是隶属于JVM的. 如 ...

最新文章

  1. python的知识点注意事项
  2. [译] iOS 开发之新版 APNs 搭建必备知识
  3. 不同系统下的shell的不同_不同论文检测系统有哪些区别?
  4. 6号团队-团队任务4:每日立会(2018-11-28)
  5. ssh终端远程登陆主机命令--笔记
  6. android bitmap xml,XML Bitmap
  7. 本地升级MySQL数据库版本为8.0.23,使用SQLyog(小海豚)无法进行连接
  8. Swift3.0朝圣之路-Then协议库-绝妙的初始化方式
  9. msys2编译ffmpeg:ERROR: libx264 not found
  10. 融合不是冗余,全栈自研才有出路?特斯拉/Mobileye这样做
  11. 创业公司必备,20个提升团队工作效率的工具神器
  12. 音视频系列--MediaProjection录屏生成H264和H265文件
  13. 超阅科技001:冰火九重天
  14. Strurts(四)——从Struts原型模拟看大道至简(含实例下载)
  15. open-falcon原理以及使用(不断更新)
  16. qq音乐sign算法还原源码放送及jsvmp全流程分析
  17. 记账之后的收支明细,如何以收支图表的形式呈现
  18. TopCoder HowEasy
  19. python 中文分析句子成分_语文句子成分分析详解
  20. 非标自动化机械设计行业未来发展趋势

热门文章

  1. 如何快速学习一门技术或进入一个岗位
  2. python-re模块
  3. flutter 弹框 dialog,flutter提示框
  4. Flutter MaterialApp概述以及主题配置概述
  5. Android ListView下拉与上拉刷新加载更多(一)
  6. Android FancyCoverFlow的使用实现图片画廊形式的呈现
  7. RabbitMQ实战经验分享
  8. linux 远程调试
  9. 关于java.util.Properties读取中文乱码的正确解决方案(不要再用native2ascii.exe了)...
  10. 【leetcode刷题笔记】Merge k Sorted Lists