原标题:软件测试学习Java的内存模型

软件测试学习Java的内存模型

主内存与工作内存

定义程序中各个变量的访问规则。

规定JVM必须遵循的最小保证。

定义操作的偏序关系。Happens-Before规则:发布共享对象与另一线程访问对象。

说明了某个线程的内存操作,在哪些情况下对其他线程是可见的。

之前发生:Happens-Before 一代码块在其他开始前完成。

同步约束:Synchronized-with 把对象视图与主内存同步

【规则】

1.解锁与后续锁操作存在同步约束。

2.volatile变量写入和读取存在同步约束。

3.若A受到B的同步约束,则A在B之前发生。

4.程序中A出现在B之前,则A在B之前发生。

Java语言的内存模型由一些规则组成,这些规则确定线程对内存的访问如何排序以及何时可以确保它们对线程是可见的。

【特征】

原子性,可见性,有序性。

【编译器操作指令的重排序】

内存模型描述了程序的可能行为。具体的编译器实现可以产生任意它喜欢的代码 -- 只要所有执行这些代码产生的结果,能够和内存模型预测的结果保持一致。这为编译器实现者提供了很大的自由,包括操作的重排序。

编译器生成指令的次序,可以不同于源代码所暗示的“显然”版本。

重排序后的指令,对于优化执行以及成熟的全局寄存器分配算法的使用,都是大有脾益的,它使得程序在计算性能上有了很大的提升。

重排序类型包括:

编译器生成指令的次序,可以不同于源代码所暗示的“显然”版本。

处理器可以乱序或者并行的执行指令。

缓存会改变写入提交到主内存的变量的次序。

内存可见性

由于现代可共享内存的多处理器架构可能导致一个线程无法马上(甚至永远)看到另一个线程操作产生的结果。所以 Java 内存模型规定了 JVM 的一种最小保证:什么时候写入一个变量对其他线程可见。

在现代可共享内存的多处理器体系结构中每个处理器都有自己的缓存,并周期性的与主内存协调一致。假设线程 A 写入一个变量值 V,随后另一个线程 B 读取变量 V 的值,在下列情况下,线程 B 读取的值可能不是线程 A 写入的最新值:

执行线程 A 的处理器把变量 V 缓存到寄存器中。

执行线程 A 的处理器把变量 V 缓存到自己的缓存中,但还没有同步刷新到主内存中去。

执行线程 B 的处理器的缓存中有变量 V 的旧值。

Happens-before 关系

happens-before 关系保证:如果线程 A 与线程 B 满足 happens-before 关系,则线程 A 执行动作的结果对于线程 B 是可见的。如果两个操作未按 happens-before 排序,JVM 将可以对他们任意重排序。

下面介绍几个与理解 ConcurrentHashMap 有关的 happens-before 关系法则:

程序次序法则:如果在程序中,所有动作 A 出现在动作 B 之前,则线程中的每动作 A 都 happens-before 于该线程中的每一个动作 B。

监视器锁法则:对一个监视器的解锁 happens-before 于每个后续对同一监视器的加锁。

Volatile 变量法则:对 Volatile 域的写入操作 happens-before 于每个后续对同一 Volatile 的读操作。

传递性:如果 A happens-before 于 B,且 B happens-before C,则 A happens-before C。返回搜狐,查看更多

责任编辑:

软件测试学java,软件测试学习Java的内存模型相关推荐

  1. java多线程学习-java.util.concurrent详解

    http://janeky.iteye.com/category/124727 java多线程学习-java.util.concurrent详解(一) Latch/Barrier 博客分类: java ...

  2. java和硬件交互_Java内存模型

    Java内存模型 我们常说的JVM内存模式指的是JVM的内存分区:而Java内存模式是一种虚拟机规范,真实并不存在 Java虚拟机规范中定义了Java内存模型(Java Memory Model,JM ...

  3. 深圳php和java,深圳java技术培训学习(Java和PHP区别)

    深圳java技术培训学习,深圳Java培训已经越来越普及了,通过Java和PHP区别,Java语言的分布性,Java语言的稳健性我们可以了解的更清楚些. Java和PHP区别 Java和PHP都是编程 ...

  4. 【JAVA】学习java 基础知识

    今天我们一起继续学习java吧! IDE集成开发环境 在我们进行java程`序开发的时候,使用的开发工具都叫IDE. 现在流行的java开发工具有: IDEA:有免费的版本和收费的版本,我们当然提倡使 ...

  5. Java 基础学习-Java语言概述

    Java 基础学习 第一章 Java语言概述 回顾java基础知识,进行整理记录. 文章目录 Java 基础学习 前言 一. Java语言发展史(了解) 二.Java语言跨平台原理(理解) 三.JRE ...

  6. Java基础:由JVM内存模型详解线程安全

    1.前言 最近在研究JVM内存模型和Java基础知识.主要讲的是线程共享变量与线程私有变量以及如何写出线程安全的代码.这里列出一条规则,"类中的成员变量,也叫实例变量,也叫全局变量,它是非线 ...

  7. modeler java堆空间,JVM|02内存模型

    JVM内存模型 概述 Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保 ...

  8. JAVA线程两种方法内存,JAVA线程基础回顾及内存模型(一)

    线程创建的两种方式 继承Thread类 class MyThread extends Thread{ ...... @Override public void run(){ ...... } } My ...

  9. 最长公共子序列算法 java,算法学习——java实现最长公共子序列,

    算法学习--java实现最长公共子序列学习--java实现最长公共子序列的算法, 实验目的: 输入两个同类型的序列,用动态规划的方法计算它们最长的公共子序列的长度和序列. (推荐教程: Java视频教 ...

  10. redis 内存不足 排查_Redis 系统学习之 redis 内存模型

    关注:架构师学习路线,每日更新互联网最新技术文章与你不断前行,实战资料,笔试面试 前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并 ...

最新文章

  1. ICLR 2022初审你得了多少分?平均4.93浮动,预测6分才被接收
  2. hbase原理与实践_HBase 性能调优第一弹:内存篇
  3. Matlab绘图基础——利用axes(坐标系图形对象)绘制重叠图像 及 一图多轴(一幅图绘制多个坐标轴)
  4. C++实现队列queue(附完整源码)
  5. cf1556B B. Take Your Places!
  6. java程序设计计算器_Java程序设计计算器(含代码)
  7. oracle常用的知识点
  8. java怎么进行浮点数运算_【考试经验】Java中实现浮点数的精确运算
  9. Java 8 终于支持 Docker !
  10. It seems that scikit-learn has not been built correctly.
  11. vs中怎么去链接一个库文件(ws2_32.lib)
  12. 中兴iptv机顶盒破解教程图文:亲测中兴B760EV3、B860A、B860AV1.1完美安装应用!非ttl破解![转]
  13. 移动播放器html,支持移动平台的Html5播放器
  14. C语言--求一元二次方程的根(分支)
  15. 海南自贸区电信行业环境分析
  16. 垂直广告是什么意思_广告新趋势——内容为王 垂直细分
  17. 外国内乱时,撤侨不一定是最佳策略
  18. 导航栏背景色、标题颜色以及返回键自定义
  19. 一文说尽NB—IOT和Lora
  20. 转载的一片关于Mapper.xml中sql的相关技术点,供以后自己慢慢学习之用

热门文章

  1. 浙大蒋超组招博后:环境暴露组和微生物组
  2. Microbiome:浙大马忠华团队-生防细菌抑制病原真菌新机制
  3. PCE:南农张瑞福组揭示微生物肥料菌种芽孢杆菌应对植物免疫防卫实现根际定殖的新策略...
  4. ISME: 中科院南京土壤所褚海燕组揭示关键菌群的生物多样性决定作物产量
  5. EM不同气候条件下土壤稀有与丰富微生物类群的分化策略
  6. WR:微生物污染源解析中宿主特异性标记物在中国的表现特征
  7. 10篇Nature专题报导人类微生物组计划2(iHMP)成果及展望
  8. R语言使用upper.tri函数、lower.tri函数、diag函数改变matrix矩阵上三角形、下三角形、对角线的数值
  9. R语言对dataframe(data.table)数据分层随机抽样实战
  10. R语言构建xgboost模型:使用xgboost构建广义线性模型(GLM):使用gblinear算法拟合线性模型并配置L1和L2正则化