java虚拟机(七)--java内存模型JMM
本文参考慕课网相关视频和博客https://mp.weixin.qq.com/s/tV0MfDdJqGwGMHCIkqnAgA,图也是这个博客的,这篇只是自己的简单总结,想要深
入理解可以访问这两块内容
内存模型定义
java memory model(简称JMM),这是一个抽象的概念,不是真实存在的。它是一种规范一个线程对共享变量的修改对另一个线程是可见的。
为了了解java内存模型,需要先了解下面的内容。
CPU多级缓存
随着CPU的发展,其频率太快了,主存无法跟上,这样导致CPU需要等待主存,大大浪费资源。所以为了解决CPU和主存之间速度不匹配的情况,
在二者之间出现了缓存。CPU能力不断提升,一层缓存往往无法满足要求,逐渐衍生出多级缓存。CPU缓存可以分为一级缓存(L1),二级缓存(L2),
部分高端CPU还具有三级缓存(L3),每一级缓存中所储存的全部数据都是下一级缓存的一部分。
单核CPU只含有一套L1,L2,L3缓存
多核CPU,则每个核心都含有一套L1(甚至和L2)缓存,而共享L3(或者和L2)缓存。
缓存一致性问题MESI:可见性问题
在CPU和主存之间增加缓存,在多线程场景下就可能存在缓存一致性问题,也就是说,在多核CPU中,每个核的自己的缓存中,关于同一个数据
的缓存内容可能不一致。缓存一致性协议保证多个CPU cache之间缓存共享数据的一致性
乱序执行优化(原子性)、指令重排(有序性)
CPU为了提高处理速度对代码执行顺序做出改变顺序的优化
很多编程语言的编译器也会有类似的优化,比如Java虚拟机的即时编译器(JIT)也会做指令重排。
java内存模型:Java Memory Model简称JMM
它是一种规范,规定了jvm和计算机内存如何协同工作的,一个线程如何和何时得到别的线程修改过后的共享变量的值,如何同步的访问共享
变量
所有的变量都存储在主内存中,每条线程还有自己的工作内存(不是真实存在的),保存了该线程中是用到的变量的主内存副本拷贝,线程对
变量的所有操作都必须在工作内存中进行,而不能直接读写主内存。不会有线程安全的问题。不同的线程之间也无法直接访问对方工作内存中的变
量,线程间变量的传递均需要自己的工作内存和主存之间进行数据同步进行。
主内存
Java 内存模型规定了所有变量都存储在主内存(Main Memory)中(此处的主内存与介绍物理硬件的主内存名字一样,两者可以互相类比,但此
处仅是虚拟机内存的一部分)。
工作内存
每条线程都有自己的工作内存(Working Memory,又称本地内存,可与前面介绍的处理器高速缓存类比),线程的工作内存中保存了该线程使用
到的变量的主内存中的共享变量的副本拷贝。
JMM抽象示意图如下:
两个线程中去通信一定要经过主存
步骤:线程A要将本地内存A操作过后的共享变量刷新到主存中,线程B到主存中去读取更新过后的共享变量
通过下面的操作来保证同步:
lock、unlock、read、load、use、assign、store、write
所以我们需要通过某些措施保证同步,线程同步需要满足:原子性、可见性、有序性,线程安全在下一篇文章中描述
java虚拟机(七)--java内存模型JMM的更多相关文章
- Java虚拟机学习 - 体系结构 内存模型
一:Java技术体系模块图 二:JVM内存区域模型 1.方法区 也称"永久代” .“非堆”, 它用于存储虚拟机加载的类信息.常量.静态变量.是各个线程共享的内存区域.默认最小值为16MB,最 ...
- Java虚拟机学习 - 体系结构 内存模型(1)
一:Java技术体系模块图 二:JVM内存区域模型 1.方法区 也称"永久代" ."非堆", 它用于存储虚拟机加载的类信息.常量.静态变量.是各个线程共享的内 ...
- Java虚拟机学习 - 体系结构 内存模型(转载)
一:Java技术体系模块图 二:JVM内存区域模型 1.方法区 也称"永久代” .“非堆”, 它用于存储虚拟机加载的类信息.常量.静态变量.是各个线程共享的内存区域.默认最小值为16MB, ...
- 深入理解Java虚拟机(一)——JVM内存模型
文章目录 程序计数器 定义 作用 特点 Java虚拟机栈 定义 特点 本地方法栈 定义 Java堆 定义 特点 方法区 定义 特点 运行常量池 直接内存 总结 Java虚拟机的内存空间分为五个部分: ...
- 【java虚拟机】jvm内存模型
作者:pengjunlee原文链接:https://blog.csdn.net/pengjunlee/article/details/71909239 目录 一.运行时数据区域 1.程序计数器 2.J ...
- java内存模型(JMM)和happens-before
目录 重排序 Happens-Before 安全发布 初始化安全性 java内存模型(JMM)和happens-before 我们知道java程序是运行在JVM中的,而JVM就是构建在内存上的虚拟机, ...
- 多线程并发之java内存模型JMM
多线程概念的引入是人类又一次有效压寨计算机的体现,而且这也是非常有必要的,因为一般运算过程中涉及到数据的读取,例如从磁盘.其他系统.数据库等,CPU的运算速度与数据读取速度有一个严重的不平衡,期间如果 ...
- Java内存模型JMM 高并发原子性可见性有序性简介 多线程中篇(十)
JVM运行时内存结构回顾 在JVM相关的介绍中,有说到JAVA运行时的内存结构,简单回顾下 整体结构如下图所示,大致分为五大块 而对于方法区中的数据,是属于所有线程共享的数据结构 而对于虚拟机栈中数据 ...
- 来,了解一下Java内存模型(JMM)
网上有很多关于Java内存模型的文章,在<深入理解Java虚拟机>和<Java并发编程的艺术>等书中也都有关于这个知识点的介绍.但是,很多人读完之后还是搞不清楚,甚至有的人说自 ...
随机推荐
- Project Euler problem 68
题意须要注意的一点就是, 序列是从外层最小的那个位置顺时针转一圈得来的.而且要求10在内圈 所以,这题暴力的话,假定最上面那个点一定是第一个点,算下和更新下即可. #include <iostr ...
- tt1
DIm #include iostream.h#include iostream.h# #include iostream.h http://www.cnblogs.com/cmt/archive/2 ...
- Cocos2d-x3.1下 Android,APK自己主动升级
项目要做Android的自己主动升级,对于我们之前做iOS的转Cocos开发做Android方面的功能..... 不正确说了.这里记录下我的实现过程. 原文地址:http://blog.csdn.ne ...
- Codeforces(429D - Tricky Function)近期点对问题
D. Tricky Function time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- JavaScript你所不知道的困惑(1)
困惑一: 先看一个样例: function test(){ message = "hi"; } test(); alert(message); 会输出字符串"hi&quo ...
- spring boot-启动及配置文件
spring boot启动: 1:默认启动方法 public static void main(String[] args) { SpringApplication.run(UserServiceAp ...
- Ubuntu新版中javascript-common.conf害死人啊
自动把javascript目录映射到系统的/usr/share 下面了,删掉对应的软链接再重启就好了
- 8-15 globalCompositeOperation阶段练习二
8-15 globalCompositeOperation阶段练习二 <!DOCTYPE html> <html lang="zh-cn"> <hea ...
- odb_sqlite_demo
#include <iostream> #include <odb/database.hxx> #include <odb/transaction.hxx ...
- 解决 IDEA 中文乱码
一.打开Intellij的根目录,找到下图的两个文件(根据你的系统是32位或64位选择其中一个配置文件),在配置文件中添加:-Dfile.encoding=UTF-8 二. 配置IDE编码 点击F ...