并发编程-java内存模型
1. 基本概念
程序:静态,用于完成某些功能的代码。
进程:动态,运行中的程序
线程:进程中的实际运作单位,一个进程可以包含一个或多个线程。
2. JVM内存区域
- 堆:线程共享,存放实例对象 (OOM)
- 虚拟机栈 :线程私有 ,Java方法在运行时的内存模型 (OOM),存放局部变量、引用类型数据的地址、操作数栈
- 本地方法栈
- 方法区 : 线程共享,存放类信息,常量,静态变量等
- 程序计数器 : 线程私有, 存放下一条指令的地址
3. java内存模型(java memory model, JMM,抽象的模型)
作用: 规范内存空间和工作空间数据的交互
主内存: 线程共享的信息
工作内存:线程私有的信息。基本数据类型,直接分配到工作内存。引用的地址存放在工作内存,引用的对象存放在堆中。
工作方式:
线程修改私有数据,直接在工作空间改
线程修改共享数据,把数据复制到工作空间中,在工作空间中修改,修改完成后,刷新到内存。
4. 硬件内存架构
CPU缓存一致性问题的解决方案:
1. 总线加锁(粒度太大) : 降低CPU的吞吐量
2. 缓存一致性协议(MESI)
读操作:不做任何事情,把cache中的数据读到寄存器
写操作:发出信号通知其他CPU将该变量的cache line置为无效。其他CPU要访问这个变量只能从内存中读取。
5. java线程与硬件处理器
6. 并发编程的三个特性
原子性:不可分割 x=1
可见性:线程只能操作自己工作空间中的数据
有序性:程序中的顺序不一定就是执行的顺序(编译重排序、指令重排序,目的:提高效率
JMM对三个特征的保证
- JMM与原子性
- X=10 写 原子性 如果是私有数据具有原子性,如果是共享数据没原子性(读写)
- Y=x 没有原子性
- 把数据X读到工作空间(原子性)
- 把X的值写到Y(原子性)
- I++ 没有原子性
- 读i到工作空间
- +1;
- 刷新结果到内存
- Z=z+1 没有原子性
- 读z到工作空间
- +1;
- 刷新结果到内存
多个原子性的操作合并到一起没有原子性
保证方式:
Synchronized
JUC Lock的lock
JMM与可见性 : 线程只能操作自己工作空间中的数据
Volatile
Synchronized:加锁
JUC JUC Lock的lock
- JMM与有序性 :程序中的顺序不一定就是执行的顺序
Volatile:
Synchronized:
Happens-before原则:
- 程序次序原则
- 锁定原则 :后一次加锁必须等前一次解锁
- Volatile原则:霸道原则
- 传递原则:A---B ---C A--C
转载于:https://www.cnblogs.com/yintingting/p/11409370.html
并发编程-java内存模型相关推荐
- 1. Java并发编程-Java内存模型
并发问题的原因可以归结为三大类:可见性,有序性和原子性. 可见性的原因是CPU缓存,不同CPU之间缓存的数据互相之间不可见. 有序性的原因是编译优化(指令重排序) 原子性的原因是一条高级指令可能对应多 ...
- Java并发编程-Java内存模型(JMM)
前言 在上一章 Java并发编程-Android的UI框架为什么是单线程的? 中笔者介绍了并发编程线程安全「三大恶」:「可见性」.「原子性」以及「有序性」 广义上来说,并发编程问题笔者归纳为:是由于后 ...
- 死磕Java并发:Java内存模型之总结
本文转载自公众号: Java技术驿站 经过四篇博客阐述,我相信各位对Java内存模型有了最基本认识了,下面LZ就做一个比较简单的总结. 1.总结 JMM规定了线程的工作内存和主内存的交互关系,以及线程 ...
- java并发编程系列-内存模型基础
java线程之间的通信对程序开发人员是完全透明的,内存的可见性问题很容易困扰很多开发人员.本篇博文将揭开java内存模型的神秘面纱,来看看内存模型到底是怎样的. 并发编程中需要处理的两个关键问题: · ...
- java 并发模型总类_java并发编程系列-内存模型基础
java线程之间的通信对程序开发人员是完全透明的,内存的可见性问题很容易困扰很多开发人员.本篇博文将揭开java内存模型的神秘面纱,来看看内存模型到底是怎样的. 并发编程模型的分类 并发编程中需要处理 ...
- 死磕Java并发:Java内存模型之分析volatile
近期活动:加班的你,需要一束光 本文转载自公众号: Java技术驿站 前篇文章<死磕Java并发:深入分析volatile的实现原理>中已经阐述了volatile的特性了: volatil ...
- java 并发存储,java并发编程——Java存储模型(JMM)
--仅作笔记使用,内容多摘自<java并发编程实战> Java内存模型(JMM) JMM是Java并发编程的基础,了解JMM,可以帮助我们对并发编程的机制有更深入的了解,在了解JMM之前, ...
- 彻底理解Java并发:Java内存模型
本篇内容包括:进程与线程&并行与并发的基本概念,Java内存模型中的内存划分.内存交互.内存交互,以及JMM的相关概念,包括了 CPU 和缓存一致性.重排序.处理器重排序与内存屏障指令.JMM ...
- 《菜鸟读并发》java内存模型之happen-before
面试题:happen-before的八个基本规则你知道吗? Happens-Before Happens-Before真正要表达的是:前面一个操作的结果对后续操作是可见的. 就像有心灵感应的两个人,虽 ...
最新文章
- VTK:PolyData之QuantizePolyDataPoints
- 【Linux】一步一步学Linux——bunzip2命令(66)
- TensorFlow学习笔记(二十四)自制TFRecord数据集 读取、显示及代码详解
- Tomcat 配置和spring-framework MVC配置简介
- leetcode 第 216 场周赛 整理
- MFC中CString,int,string,char * ,char[] 之间互转
- Eclipse调试Java的10个技巧
- 决策树算法小结(二) C4.5原理及代码实现
- 【工具相关】iOS-Reveal的使用
- asp.net 4高级程序设计( 第4版)文摘
- FDDB人脸检测测评数据集介绍
- mac无法连接服务器无法定位当前位置,mac book pro 无法定位
- 免费谷歌卫星地图下载器
- windows控制面板卸载程序失败(等待。。。)
- 获取两个向量中间位置的点
- 信安数学/网安数学——证明形如4k-1的素数有无限个
- oracle 断电起不来,解决方案
- css让文字不停浮动
- SinaWeibo Oauth2.0授权问题
- “瑞幸现象”背后的启示与警示 | 一点财经