内存模型基础

并发模型的两个关键问题

在并发编程中,需要处理两个关键问题:线程之间如何通信及线程之间如何同步

通信是指线程之间以何种机制来交换信息。在命令是编程中,线程之间的通信机制由了两种:共享内存消息传递

共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。在消息传递的并发模型里,线程之间没有公告状态,线程之间必须通过发送消息来显示进行通信。

同步是指程序中用于控制不同线程间操作发生相对顺序的机制。在共享内存并发模型里,同步时显示进行的。程序员必须显示指定某个方法或某段代码需要在线程之间互斥执行。在消息传递的并发模型里,由于消息的发送必须在消息的接受之前,因此同步时隐式进行的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Java的并发采用的时共享内存模型,Java线程之间的通信总是隐式进行的,整个通信过程必须显示的指定。

Java内存模型的抽象概念

在java中,所有的实例域,静态域和数组元素都存储在堆内存中,对内存在线程之间共享。局部变量,方法定义参数和异常处理器参数不会在线程之间共享。

Java线程之间的通信由Java内存模型(JMM)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。

JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存中,每个线程都会有一个私有的本地内存,本地内存中存储了该线程以读/写共享变量的副本。

内存屏障类型

为了保证内存可见性,Java编译器在生成指令序列的适当位置会插入内存屏障指令来禁止特定类型处理器重排序,

屏障类型 指令示例 说明
LoadLoad Barriers Load1;LoadLoad;Load2 确保Load1数据的装载先于Load2及所有后续装在命令的装载
StoreStore Barriers Store1;StoreStore;Store2 确保Store1数据对于其他处理可见(刷新到内存)先于Store2及所有后续存储指令的存储
LoadStroe Barriers Load1;LoadStroe;Stroe2 确保Load1数据装载优先于Stroe2及所有后续的存储指令刷新到内存
StroeLoad Barriers Stroe1;StroeLoad;Load2 确保Stroe1数据对其他处理器变得可见优先于Load2及所有后续装载指令的装载。StroeLoad Barriers 会事该屏障之前所有内存访问指令完成之后,才执行该屏障之后的内存访问指令

happens-before

从JDK 5 开始,Java使用心得JSR-133内存模型。JSR-133使用happens-berore的概念来阐述操作之间的内存可见性。在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作就存在Happens-before关系。

程序顺序规则:一个线程中的每个操作,Happens-before于该线程中的任意后续操作
监视器锁规则:对一个锁的解锁,happens-before于随后对这个锁的加锁。
volatile变量规则:对一个volatile域的写,happens-before 于任意后续对这个volatile域的读。
传递性:如果A happens-before B,且B happens-before C ,那么A happens-before C

重排序

重排序是指编译器和处理器为了优化程序性能而对指令序列重新排序的一种手段

as-if-serial

as-if-serial的意识:不管怎样重排序,线程的执行结果是不能被改变的。编译器,runtime和处理器都必须遵守as-if-serial。
参考书籍:
《Java并发编程的艺术》

Java内存模型(Java并发编程的艺术整理)相关推荐

  1. JSR 133 Java内存模型以及并发编程的最权威论文汇总

    Java内存模型 先看官方文档: https://docs.oracle.com/javase/specs/ JSR 133:Java TM内存模型和线程规范修订版:https://www.jcp.o ...

  2. java内存 海子_Java并发编程:从根源上解析volatile关键字的实现

    Java并发编程:volatile关键字解析 1.解析概览 内存模型的相关概念 并发编程中的三个概念 Java内存模型 深入剖析volatile关键字 使用volatile关键字的场景 2.内存模型的 ...

  3. 浅谈Java内存模型、并发、多线程

    浅谈Java内存模型.并发.多线程 Java内存模型(Java Memory Model)是围绕着在并发编程中如何处理原子性,可见性,有序性三个特性而建立的模型. 下面我简单描述一下这三个特性: 原子 ...

  4. Java内存模型(Java Memory Molde,JMM)

    文章目录 1.Java内存模型(Java Memory Molde,JMM) 2. 多线程先行发生原则之happens-before 1.Java内存模型(Java Memory Molde,JMM) ...

  5. 第十六章:Java内存模型——Java并发编程实战

    一.什么是内存模型,为什么要使用它 如果缺少同步,那么将会有许多因素使得线程无法立即甚至永远看到一个线程的操作结果 编译器把变量保存在本地寄存器而不是内存中 编译器中生成的指令顺序,可以与源代码中的顺 ...

  6. Java内存模型(Java Memory Model,JMM)

    导读 本文通过对JSR133规范的解读,详细的介绍JMM的核心理论,并将开发中常用的关键字的实现原来做了详细的介绍.通过本文读者可以了解到并发的一些基本理论,并对一些同步原语有了更深层次的理解.希望读 ...

  7. 【Android 内存优化】Java 内存模型 ( Java 虚拟机内存模型 | 线程私有区 | 共享数据区 | 内存回收算法 | 引用计数 | 可达性分析 )

    文章目录 一. Java 虚拟机内存模型 二. 程序计数器 ( 线程私有区 ) 三. 虚拟机栈 ( 线程私有区 ) 四. 本地方法栈 ( 线程私有区 ) 五. 方法区 ( 共享数据区 ) 1. 方法区 ...

  8. java内存 海子_Android 面试经验 - Java 内存模型 - Java 技术驿站-Java 技术驿站

    Java内存模型 目录 Java执行流程 Java文件被编译成字节码文件之后,由JVM中的类加载器进行加载,加载完毕之后,交由JVM的执行引擎执行.在程序执行的过程中,JVM会用一段空间来存储数据和相 ...

  9. Java 内存模型(Java Memory Model,JMM)

    为了屏蔽各种硬件和操作系统的内存访问差异,JVM制定了一套JMM内存模型来实现同一套Java程序在不同平台上实现一样的运行效果.也就是一次编译到处运行跨平台的效果. JVM内存分配概念 JVM两个重要 ...

  10. java 自旋锁_Java并发编程的艺术05-队列自旋锁

    Queue Spin-Lock 队列锁是一种可扩展自旋锁的方法,这种实现比BackoffLock稍微复杂一些,但是却有更好的移植性.在BackoffLock算法中有两个问题: 1. cache一致性流 ...

最新文章

  1. 细谈普通网站的后台构建实战----my note
  2. 任务间资源共享问题示例
  3. 解读区块链,软分叉和硬分叉
  4. 女程序员在这里落脚啦
  5. 如何用2分钟做出一张拥有“黑洞”和“脑洞”的热力地图?
  6. jquery基础知识(一)
  7. jquery表单选择器input、:text、:password、:radio、:checkbox、:submit、:reset、:image、:button、:file、:hidden
  8. hdu 1506 单调栈问题
  9. linux内核怎么变化,Linux内核中CPU状态变化机制简介
  10. 【原创】Web前端性能优化思维导图
  11. 魔兽世界各服务器显示版本,魔兽7.1各服通用界面AltzUI
  12. DSPTMS320C6678的数据导入方法
  13. 十行以内,你写过哪些比较酷的 Matlab 代码?
  14. 今日头条信息流 - 广告策略
  15. 身份证验证接口有哪些验证类型
  16. Java虚拟机启动整体流程和基础学习(内容很多,不可快餐阅读),推理+源码论证
  17. 【数学基础】简单易懂的张量求导和计算图讲解
  18. Device Sheets
  19. dhcp snooping华为_华为交换机DHCP snooping
  20. 去掉Nero 8刻录时激活三方专利组件的提示框

热门文章

  1. python题目58:工厂流水线调度
  2. 易语言大漠插件制作脚本教程
  3. 【安装SSH服务】ubuntu安装ssh以及开启root用户ssh登录
  4. SketchUp教程:BIG事务所的建筑竞赛分析图表现(附笔刷+处理稿)
  5. CFPS数据处理:少儿代答库与成人库匹配
  6. 企业图纸共享办公系统哪个好
  7. Dagger2基本使用
  8. python100以内奇数累加和_用python脚本来计算100以内奇数或者偶数之和
  9. C语言:输出乘法口诀表
  10. php一键集成环境安装包,APMXN集成环境一键安装包(php环境一键安装包)V1.0.2 最新版...