02 java内存模型
java内存模型
1、JVM内存区域

- 方法区:类信息、常量、static、JIT (信息共享)
- java堆:实例对象 GC (信息共享) OOM
- VM stack:JAVA方法在运行的内存模型 (OOM)
- PC: java线程的私有数据,这个数据就是执行下一条指令的地址
- Native method stack: 月JVM的native
2、java内存模型(JMM 规范、抽象的模型)

- 主内存:共享的信息
- 工作内存:私有信息、基本数据类型,直接分配到主内存,引用的地址放在工作内存中,引用的对象放在堆中
- 工作方式:
- 线程修改私有数据,直接在工作内存修改
- 线程修改共享数据,把数据复制到工作空间中,在工作空间中修改,修改完之后,刷新到主内存中
3、 硬件内存架构月java内存模型

cpu缓存的一致性问题:并发处理的不同步
解决方法:
- 总线加锁 降低了CPU的吞吐量
- 缓存上的一致性协议(MESI)<br>
当cpu在cache中操作数据时,如果该数据是共享变量,数据在cache读到寄存器中,进行新修改,并更新内存数据<br>
cache line值无效,其他的cpu就从内存中读数据
4、 并发编程的三个重要特征
原子性、可见性和有序性
- 原子性保证方式:
- synchronized
- JUC Lock的lock
- 可见性
- volatile:在JMM模型上实现MESI协议
- synchronized:加锁
- JUC Lock的lock
- 有序性
- Volatile禁止重排序
- synchronized
- happens-before原则
- 程序次序原则
- 锁定原则:后一次加锁必须等前一次解锁
- Volatile原则:霸道原则
- 传递原则:A--B--C A--C
02 java内存模型的更多相关文章
- 02 | Java内存模型:看Java如何解决可见性和有序性问题
什么是 Java 内存模型? 导致可见性的原因是缓存,导致有序性的原因是编译优化,那解决可见性. 有序性最直接的办法就是禁用缓存和编译优化,但是这样问题虽然解决了,我们程序的性能可就堪忧了. 合理 ...
- 《深入理解Java内存模型》读书总结
概要 文章是<深入理解Java内容模型>读书笔记,该书总共包括了3部分的知识. 第1部分,基本概念 包括"并发.同步.主内存.本地内存.重排序.内存屏障.happens befo ...
- 深入理解JVM(6)——Java内存模型和线程
Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM)用来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果(“即Ja ...
- Java 内存模型_1
title: Java 内存模型_1 date: 2017-01-15 17:11:02 tags: [JMM] categories: [Programming,Java] --- 概述 本文记录 ...
- Java 内存模型_2
title: Java 内存模型_2 date: 2017-01-28 02:04:06 tags: [JMM] categories: [Programming,Java] --- Why 理解 J ...
- Java内存模型的深入理解
基础 并发编程的模型分类 在并发编程需要处理的两个关键问题是:线程之间如何通信 和 线程之间如何同步. 通信 通信 是指线程之间以何种机制来交换信息.在命令式编程中,线程之间的通信机制有两种:共享内存 ...
- Java内存模型(转载)
本文章节: 1.JMM简介 2.堆和栈 3.本机内存 4.防止内存泄漏 1.JMM简介 i.内存模型概述 Java平台自动集成了线程以及多处理器技术,这种集成程度比Java以前诞生的计算机语言要厉害很 ...
- 《深入理解Java内存模型》读书总结(转-总结很好)
概要 文章是<深入理解Java内容模型>读书笔记,该书总共包括了3部分的知识. 第1部分,基本概念 包括“并发.同步.主内存.本地内存.重排序.内存屏障.happens before规则. ...
- 深入理解 Java 内存模型(转载)
摘要: 原创出处 http://www.54tianzhisheng.cn/2018/02/28/Java-Memory-Model/ 「zhisheng」欢迎转载,保留摘要,谢谢! 0. 前提 &l ...
随机推荐
- 手写符合Promise/A+规范的Promise
const PENDING = "pending"; const RESOLVED = "resolved"; const REJECTED = "r ...
- Python语言为什么被称为高级程序设计语言?
Python是一种令人惊叹的编程语言,毫无疑问.从1991年的卑微开始,它现在几乎无处不在.无论您是在进行Web开发,系统管理,测试自动化,devop还是数据科学,Python在您的工作中发挥作用的可 ...
- w = tf.Variable(<initial-value>, name=<optional-name>)
w = tf.Variable(<initial-value>, name=<optional-name>)
- LYXF-PE-tools
先随便说一下这个PE-tools有什么用? 我开发这款PE-tools是为了学习而开发的,且是开源的,这里我会提供源码链接.它可以解析windows 32/64位程序中比较常用的一些属性. 里面有个稍 ...
- js把两个对象合并成一个对象
Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象.它将返回目标对象 语法: Object.assign(target, ...sources)参数 targ ...
- XML 语法
XML 语法规则 本节的目的是想让你了解 XML 中的语法所依据的规则,避免在编写 XML 文档的时候遇到错误. XML 的语法规则很简单,且很有逻辑.这些规则很容易学习,也很容易使用. 所有的 XM ...
- 给数据库用户授权(对象多为系统表,如dba可以查看的表)
我们知道,创建一个新用户时,网上各种的帖子包括书籍中经常用到一个grant connect,resource to user;,这样才能用这个用户登录数据库,那么这条语句的真正作用是什么呢? 首先,g ...
- PHP 最全的正则表达式
一.校验数字的表达式 1 数字:^[0-9]*$2 n位的数字:^\d{n}$3 至少n位的数字:^\d{n,}$4 m-n位的数字:^\d{m,n}$5 零和非零开头的数字:^(0|[1-9][0 ...
- Java并发指南14:JUC中常用的Unsafe和Locksupport
本文转自网络,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutoria ...
- oracle系统对象
select * from all_tab_comments-- 查询所有用户的表,视图等 select * from user_tab_comments -- 查询本用户的表,视图等 select ...