在计算中, 内存模型描述了线程如何通过内存进行交互,或更一般地,它指定了为分段内存或分页内存平台生成代码时允许编译器进行的假设。 在给定程序和该程序的执行跟踪的情况下,它实质上描述了执行跟踪是否是该程序的合法执行。

Java内存模型描述了Java编程语言中的线程如何通过内存进行交互。 连同代码的单线程执行描述一起,内存模型提供了Java编程语言的语义。 最初的Java内存模型开发于1995年,人们普遍认为它已损坏,从而阻止了许多运行时优化,并且没有为代码安全性提供足够有力的保证。 它通过Java社区流程进行了更新,即Java规范请求133(JSR-133) (于2004年对Tiger(Java 5.0)生效)。

您可以在Java语言规范的“ 线程和锁 ”一章以及此Java内存模型讨论页面中找到一些非常有用的信息。

现在,让我们从“ The Khangaonkar Report ”中看到我们最新的JCG合作伙伴 Manoj提供的有关该主题的一些见解。

(注意:对原始帖子进行了少量编辑以提高可读性)

Java内存模型描述了定义多个线程写入和读取变量时如何看待写入内存的规则。

当线程读取变量时,它不一定从内存中获取最新值。 处理器可能返回一个缓存的值。 此外,即使程序员在编写代码时先写入变量,然后读取变量,但只要编译器不改变程序语义,就可以对语句重新排序。 处理器和编译器通常会这样做以优化性能。 结果,线程可能看不到它期望看到的值。 这可能导致难以修复并发程序中的错误。

Java编程语言提供了“ synchronized”,“ volatile”和“ final”关键字来帮助编写安全的多线程代码。 但是,由于内存模型未指定,Java的早期版本存在一些问题。 JSR 133(Java内存模型和线程规范修订版)修复了早期内存模型中的某些缺陷。

大多数程序员都熟悉这样一个事实,即进入同步块意味着在监视器上获得一个锁,以确保没有其他线程可以进入同步块。 不那么熟悉但同样重要的事实是

(1)获取锁并输入同步块会强制线程从内存刷新数据。
(2)退出同步块后,写入的数据将刷新到内存中。

这确保了同步块中的线程对同步块中的其他线程可见。

有没有听说过Java上下文中的“ 发生在……之前 ”? JSR 133引入了“之前发生”一词,并为程序中动作的顺序提供了一些保证。 这些保证是:

(1)线程中的每个动作都在该线程之后的所有其他动作之前发生。
(2)显示器上的解锁发生在同一显示器上的后续锁定之前
(3)对变量的易失性写入发生在对同一变量的后续易失性读取之前 (4)对Thread.start()的调用发生在该线程中的任何其他语句之前 (5)线程中的所有动作发生在该线程上的其他任何线程从join()返回之前

术语“动作”在Java语言规范的17.4.2节中定义为可以被其他线程检测或影响的语句。 正常的读/写,易失性的读/写,锁定/解锁是一些动作。

规则1、4和5保证在单个线程中,所有动作将按照它们在创作程序中出现的顺序执行。 规则2和4确保在处理共享数据的多个线程之间,保留同步块的相对顺序以及对易失变量的读/写顺序。

规则2和规则4使volatile非常类似于同步块。 在JSR 133之前,volatile仍然意味着对volatile变量的写操作直接写到内存中,而读操作则从内存中读取。 但是编译器可能会对非易失性读/写进行重新排序,而非易失性读/写会导致错误的结果。 在JSR 133之后无法使用。

还有一点值得注意。 这与在类的构造函数中初始化的最终成员有关。 只要构造函数正确完成执行,其他线程就可以看到最终成员而无需同步。 但是,如果您从构造函数中共享对对象的引用,则所有选择都将关闭。

提出的规范描述了线程,锁,易失性变量和数据竞争的语义。 这包括所谓的Java内存模型 。

相关文章:

  • Cajo,用Java完成分布式计算的最简单方法
  • Java最佳实践–高性能序列化
  • Java最佳实践–字符串性能和精确字符串匹配
  • Java最佳实践– Vector vs ArrayList vs HashSet
  • Java最佳实践–队列之战和链接的ConcurrentHashMap

翻译自: https://www.javacodegeeks.com/2011/02/java-memory-model-quick-overview-and.html

Java内存模型–快速概述和注意事项相关推荐

  1. java内存模型概述_Java内存模型-快速概述和注意事项

    java内存模型概述 在计算中, 内存模型描述了线程如何通过内存交互,或更一般地,它指定了为分段内存或分页内存平台生成代码时允许编译器进行的假设. 在给定程序和该程序的执行跟踪的情况下,它实质上描述了 ...

  2. 快速带你分清java内存结构,java内存模型,java对象模型和jvm内存结构!

    现如今你是否有这样的感觉,无论生活还是学习,节奏都是非常的快,每天面对海量的知识信息,自己感觉都要hold不住了,每天打开微信公众号,是不是发现有几十条未读,无论是技术文章还是其他类型的文章,我们大多 ...

  3. Java内存模型(转载)

    1. 概述 多任务和高并发是衡量一台计算机处理器的能力重要指标之一.一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per Second,TPS)这个指标比较能说明问题 ...

  4. 并发编程-02并发基础CPU多级缓存和Java内存模型JMM

    文章目录 CPU多级缓存 CPU多级缓存概述 CPU 多级缓存-缓存一致性协议MESI CPU 多级缓存-乱序执行优化-重排序 JAVA内存模型 (JMM) 计算机硬件架构简易图示 JAVA内存模型与 ...

  5. jvm(12)-java内存模型与线程

    [0]README 0.1)本文部分文字描述转自"深入理解jvm",旨在学习"java内存模型与线程" 的基础知识: [1]概述 1)并发处理的广泛应用是使得 ...

  6. JVM——Java内存模型(JMM)

    关注微信公众号:CodingTechWork,一起学习进步. 软硬件发展概述 Amdahl定律和摩尔定律 1)Amdahl定律:通过系统中并行化和串行化的比重来描述多处理器系统能获得的运算加速能力. ...

  7. Java内存模型的抽象结构

    一. 概述 多任务和高并发是衡量一台计算机处理器的能力重要指标之一.一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per Second,TPS)这个指标比较能说明问题 ...

  8. 深入理解Java虚拟机(周志明第三版)- 第十二章:Java内存模型与线程

    系列文章目录 第一章: 走近Java 第二章: Java内存区域与内存溢出异常 第三章: Java垃圾收集器与内存分配策略 并发处理的广泛应用是Amdahl定律代替摩尔定律成为计算机性能发展源动力的根 ...

  9. 重点知识学习(8.2)--[JMM(Java内存模型),并发编程的可见性\原子性\有序性,volatile 关键字,保持原子性,CAS思想]

    文章目录 1.JMM(Java Memory Model) 2.并发编程的可见性 3.并发编程的有序性 4.并发编程的原子性 5.volatile 关键字 6.保持原子性: 加锁,JUC原子类 加锁 ...

最新文章

  1. 深js, jsconf China 回顾
  2. Java开发学习--MongoDB
  3. 坐在马桶上看算法:Dijkstra最短路算法
  4. IIS+ASP+MySQL8.0+数据库连接解决方案(2019.7)
  5. 拦截器中/* vs /** ------SpringMVC
  6. 比较字符串是否相同,比较大小
  7. 2018春考计算机技能考试题目,2018年山东省春季高考技能考试信息技术类专业考试(样题).PDF...
  8. 什么叫“职业年金”,与养老保险有什么关系?
  9. python官网下载文件-使用Python下载文件的简单示例
  10. RGB图像任意角度旋转
  11. ext源码阅读 - DomHelper - createHtml,insertHtml
  12. 纺大数学与计算机学院徐涛,数学与统计学院
  13. 安装无线网卡后,显示网络电缆被拔出?
  14. LLVM 学习(二) -LLVM IR 语法理论学习
  15. 记事本开发 dos下编译java 多个类文件_通过记事本编写的java代码通过()命令运行。_学小易找答案...
  16. 标准88 钢琴键代码 html+css+js
  17. 一个服务器放多个网站seo,服务器建立多个网站 同一IP对SEO有影响吗
  18. 论文转换成引用的参考文献格式
  19. Android 常用命令行和 源码编译
  20. photoshop 去掉背景

热门文章

  1. JDK8的日期时间类3
  2. jsr303 spring_使用Spring和JSR 303进行方法参数验证
  3. spring boot示例_Spring Boot完成示例
  4. jsf 项目_您将在下一个项目中使用JSF吗?
  5. aws集群重启_在AWS中设置Cassandra集群
  6. Java面试准备:15个Java面试问题
  7. apache hadoop_通过Apache Hadoop大规模扩展Apache Solr实时实时索引
  8. Java的@Serial批注
  9. Java命令行界面(第23部分):Rop
  10. maven项目 ant_将大型项目从Ant迁移到Maven