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对三个特征的保证

  1. JMM与原子性
  1. X=10  写  原子性   如果是私有数据具有原子性,如果是共享数据没原子性(读写)
  2. Y=x  没有原子性
    1. 把数据X读到工作空间(原子性)
    2. 把X的值写到Y(原子性)
  3. I++ 没有原子性
    1. 读i到工作空间
    2. +1;
    3. 刷新结果到内存
  4. Z=z+1 没有原子性
    1. 读z到工作空间
    2. +1;
    3. 刷新结果到内存

多个原子性的操作合并到一起没有原子性

保证方式:

Synchronized

JUC   Lock的lock

JMM与可见性 : 线程只能操作自己工作空间中的数据

Volatile

Synchronized:加锁

JUC   JUC   Lock的lock

  1. JMM与有序性 :程序中的顺序不一定就是执行的顺序

Volatile:

Synchronized:

Happens-before原则:

  1. 程序次序原则
  2. 锁定原则  :后一次加锁必须等前一次解锁
  3. Volatile原则:霸道原则
  4. 传递原则:A---B ---C    A--C

转载于:https://www.cnblogs.com/yintingting/p/11409370.html

并发编程-java内存模型相关推荐

  1. 1. Java并发编程-Java内存模型

    并发问题的原因可以归结为三大类:可见性,有序性和原子性. 可见性的原因是CPU缓存,不同CPU之间缓存的数据互相之间不可见. 有序性的原因是编译优化(指令重排序) 原子性的原因是一条高级指令可能对应多 ...

  2. Java并发编程-Java内存模型(JMM)

    前言 在上一章 Java并发编程-Android的UI框架为什么是单线程的? 中笔者介绍了并发编程线程安全「三大恶」:「可见性」.「原子性」以及「有序性」 广义上来说,并发编程问题笔者归纳为:是由于后 ...

  3. 死磕Java并发:Java内存模型之总结

    本文转载自公众号: Java技术驿站 经过四篇博客阐述,我相信各位对Java内存模型有了最基本认识了,下面LZ就做一个比较简单的总结. 1.总结 JMM规定了线程的工作内存和主内存的交互关系,以及线程 ...

  4. java并发编程系列-内存模型基础

    java线程之间的通信对程序开发人员是完全透明的,内存的可见性问题很容易困扰很多开发人员.本篇博文将揭开java内存模型的神秘面纱,来看看内存模型到底是怎样的. 并发编程中需要处理的两个关键问题: · ...

  5. java 并发模型总类_java并发编程系列-内存模型基础

    java线程之间的通信对程序开发人员是完全透明的,内存的可见性问题很容易困扰很多开发人员.本篇博文将揭开java内存模型的神秘面纱,来看看内存模型到底是怎样的. 并发编程模型的分类 并发编程中需要处理 ...

  6. 死磕Java并发:Java内存模型之分析volatile

    近期活动:加班的你,需要一束光 本文转载自公众号: Java技术驿站 前篇文章<死磕Java并发:深入分析volatile的实现原理>中已经阐述了volatile的特性了: volatil ...

  7. java 并发存储,java并发编程——Java存储模型(JMM)

    --仅作笔记使用,内容多摘自<java并发编程实战> Java内存模型(JMM) JMM是Java并发编程的基础,了解JMM,可以帮助我们对并发编程的机制有更深入的了解,在了解JMM之前, ...

  8. 彻底理解Java并发:Java内存模型

    本篇内容包括:进程与线程&并行与并发的基本概念,Java内存模型中的内存划分.内存交互.内存交互,以及JMM的相关概念,包括了 CPU 和缓存一致性.重排序.处理器重排序与内存屏障指令.JMM ...

  9. 《菜鸟读并发》java内存模型之happen-before

    面试题:happen-before的八个基本规则你知道吗? Happens-Before Happens-Before真正要表达的是:前面一个操作的结果对后续操作是可见的. 就像有心灵感应的两个人,虽 ...

最新文章

  1. VTK:PolyData之QuantizePolyDataPoints
  2. 【Linux】一步一步学Linux——bunzip2命令(66)
  3. TensorFlow学习笔记(二十四)自制TFRecord数据集 读取、显示及代码详解
  4. Tomcat 配置和spring-framework MVC配置简介
  5. leetcode 第 216 场周赛 整理
  6. MFC中CString,int,string,char * ,char[] 之间互转
  7. Eclipse调试Java的10个技巧
  8. 决策树算法小结(二) C4.5原理及代码实现
  9. 【工具相关】iOS-Reveal的使用
  10. asp.net 4高级程序设计( 第4版)文摘
  11. FDDB人脸检测测评数据集介绍
  12. mac无法连接服务器无法定位当前位置,mac book pro 无法定位
  13. 免费谷歌卫星地图下载器
  14. windows控制面板卸载程序失败(等待。。。)
  15. 获取两个向量中间位置的点
  16. 信安数学/网安数学——证明形如4k-1的素数有无限个
  17. oracle 断电起不来,解决方案
  18. css让文字不停浮动
  19. SinaWeibo Oauth2.0授权问题
  20. “瑞幸现象”背后的启示与警示 | 一点财经

热门文章

  1. c 语言常用宏定义 模板
  2. 高级C语言教程-C语言函数setjmp()函数
  3. python基础——迭代器与生成器
  4. 如何在spring中读取properties配置文件里面的信息
  5. 8086处理器的无条件转移指令——《x86汇编语言:从实模式到保护模式》读书笔记13
  6. springboot学习笔记(五)
  7. 学习使用markdown(markdown篇)
  8. Android进程使用Messenger通信
  9. 爱加密Android APk 原理解析
  10. java客户端服务器代码_Java Socket通信 客户端服务器端基本代码