java内存模型概述

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

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

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

现在让我们来看看我们最新的JCG合作伙伴 Manoj在“ The Khangaonkar Report ”中提供的一些见解。

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

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内存模型概述

java内存模型概述_Java内存模型-快速概述和注意事项相关推荐

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

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

  2. java内存模型 原子性_Java内存模型JMM 高并发原子性可见性有序性简介 多线程中篇(十)...

    JVM运行时内存结构回顾 在JVM相关的介绍中,有说到JAVA运行时的内存结构,简单回顾下 整体结构如下图所示,大致分为五大块 而对于方法区中的数据,是属于所有线程共享的数据结构 而对于虚拟机栈中数据 ...

  3. java 内存屏障类型_Java内存模型精讲

    1.JAVA 的并发模型 共享内存模型 在共享内存的并发模型里面,线程之间共享程序的公共状态,线程之间通过读写内存中公共状态来进行隐式通信 该内存指的是主内存,实际上是物理内存的一小部分 2.JAVA ...

  4. java内存分析工具_java内存查看与分析

    业界有很多强大的java profile的工具,比如Jporfiler,yourkit,这些收费的东西我就不想说了,想说的是,其实java自己就提供了很多内存监控的小工具,下面列举的工具只是一小部分, ...

  5. java 溢出与泄露_Java内存溢出与栈溢出

    一.背景知识 1.JVM体系结构 2.JVM运行时数据区 3.JVM内存模型 JVM运行时内存 = 共享内存区 + 线程内存区 3-1.共享内存区 共享内存区 = 持久带 + 堆 持久带 = 方法区 ...

  6. java内存区域与内存溢出异常_Java内存区域与内存溢出异常

    Java的内存管理是一个老生常谈的问题,虽然Java号称可以自动管理自己的内存,使程序员从内存管理的围墙解放出来,但是一连串的内存泄漏和溢出方面的问题,使得我们不得不去深入了解Java的内存管理机制. ...

  7. java 内存详解_Java内存详解

    一.了解java的内存大致划分 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中. 堆:存放用new产生的数据 静态域:存放在对象中用static定义的静态成员 常量池:存放 ...

  8. java 获取内存使用情况_Java内存使用情况查看工具

    Java通过jvm自己管理内存,同时Java提供了一些命令行工具,用于查看内存使用情况. 这里主要介绍一下jstat.jmap命令以及相关工具. 一.jstat查看 gc实时执行情况 jstat命令命 ...

  9. java double储存原理_Java内存分配原理

    Java内存分配与管理是Java的核心技术之一,一般Java在内存分配时会涉及到以下区域: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 ...

  10. eclipse占用内存过大_Java内存泄漏分析工具Memory Analyzer Tool

    一个大型的Java项目也许从开发到测试结束并可能不能未发现一些重大的问题,但是在生产环境中还是会出现一些非常棘手的问题,如内存泄漏直接导致服务宕机,遇到这样的问题对于一个经验尚浅的开发人员来说难度非常 ...

最新文章

  1. bo dto java vo_java中PO、VO、BO、POJO、DAO、DTO、TO、QO、Bean、conn的理解
  2. 收藏几个有意思的SQL脚本
  3. ToString()、Convert.ToString()、(string)、as string 的区别
  4. MySQL学习笔记03【数据库表的CRUD操作、数据库表中记录的基本操作、客户端图形化界面工具SQLyog】
  5. python拷贝文件夹目录和文件_Python 拷贝文件及文件夹到远程主机目录
  6. 信息安全工程师笔记-网络安全风险评估技术原理与应用
  7. 我和ASP.NET MVC有个约会
  8. 又议android中的manifest清单文件
  9. @Zabbix配置snmptrap及使用snmptt解析格式化输出
  10. 远程采集Linux硬盘信息,关关采集器利用远程SFTP采集 Linux放主站+windows采集教程...
  11. 油猴子(Tampermonkey )API userscliptAPI 中文翻译
  12. 发送打印任务后不打印
  13. linux监控ftp stp日志,一篇文章让你了解STP、SFTP、UTP、FTP、ASTP分别是什么网线?...
  14. ECS 7天实践训练营day5-安装Linux服务器面板管理工具
  15. 动态规划求解多段图问题
  16. 婚恋相亲交友网站搭建教程超级简单,一步就能拥有属于自己的网站
  17. 赛门铁克:深化本地化发展不是空谈
  18. 深圳家庭数据存储 家庭数据备份 数蚁科技
  19. 帆软中python调用_如何1min了解台灣及全球地震分佈情況:用PythonFineReport培養分析思維(上)...
  20. 转帖 FreeTextBox 工具条

热门文章

  1. thymeleaf如何迭代遍历,如何判断
  2. Spring-boot IDEA使用注解@ConfigurationProperties时报错解决
  3. Mybatis入门 使用XML
  4. Java获取指定月份的最后一天
  5. django mysql 创建表_关于 django ORM 中,数据库建表方式的问题
  6. java平台脚本+java编译器API
  7. 基于springboot+vue的前后端分离商城系统
  8. 超音速 启动_从根本上讲超音速亚原子Enterprise Java
  9. ssrs 基于表达式显示_基于表达式的访问控制
  10. 日志间隔_在日志中搜索时间间隔