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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359743.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle目录删除后恢复,Oracle删除后不能重新安装的解决方法

很多朋友只用了Oracle的删除,但很多情况下,他会发现重新安装时,点了下一步安装界面就消失了,往往无奈下只好重装系统,其实只是你数据库没删干净,删干净就不会出现这种情况了。实现方法:1、 开始…

jquery简单实现树形结构收缩展开效果

代码量很少&#xff0c;注意要取消冒泡 e.stopPropagation(); <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8"><title></title><style type"text/css">.child{ display: none;}li{ cu…

转子碰磨 matlab,航空科普:什么是航空发动机转子碰磨?

中国航空报讯&#xff1a;随着人们对航空发动机油耗、推重比等要求的逐步提高&#xff0c;提升航空发动机运行效率&#xff0c;尤其是提升民用航空发动机的经济性已经变得越来越重要。航空发动机的总体运行效率是气动效率、燃烧效率、冷却效率与机械效率等共同决定的。其中&…

Android 自定义 ListView 显示网络上 JSON 格式歌曲列表

本文内容 环境 项目结构 演示自定义 ListView 显示网络上 JSON 歌曲列表 参考资料 本文最开始看的是一个国人翻译的文章&#xff0c;没有源代码可下载&#xff0c;根据文中提供的代码片段&#xff0c;自己新建的项目&#xff08;比较可恶的是&#xff0c;没有图标图片资源&…

oracle 索引invisible,Oracle index unusable和invisible的区别

invisible index会被优化器所忽略&#xff0c;但是dml操作仍然会维护索引。在session或者system级别使用参数OPTIMIZER_USE_INVISIBLE_INDEX摘录自Oracle 11g的官方文档&#xff1a;UNUSABLE Specify UNUSABLE to mark the index or index partition(s) or index subpartition(…

php16进制密钥签名对接支付,简单理解rsa的加密和签名-PHP实现

我们先动手在linux上生成一下rsaPs&#xff1a;openssl是一堆加密算法和安全协议的开源集合,像RSA,DES,MD5,RC4等等,都能在openssl里面找到源代码.用openssl指定生成test.key文件&#xff0c;其中包含公钥私钥&#xff0c;1024为生成密钥长度tbtb:~/mimi$ openssl genrsa -out …

angularjs 服务

内置服务 1、$timeout 2、$watch(obj,fun)&#xff1a; fun(newVal,oldVal,scope) //newVal是新改变的值&#xff0c;oldVal是旧值 3、$destroy()&#xff1a;作用域的销毁&#xff0c;如果子作用域不再有用了。那么子作用域的创建者就会负责用$destroy()来将它销毁。这回停止$…

java中字符和字节的转换_Java最佳实践–字符到字节和字节到字符的转换

java中字符和字节的转换在使用Java编程语言时&#xff0c;我们将继续讨论与建议的实践有关的系列文章&#xff0c;我们将讨论String性能调优。 特别是&#xff0c;我们将着重于使用默认编码时如何有效地处理字符到字节和字节到字符的转换。 本文总结了两种建议的自定义方法与两…

一个简单的单例模式的类

public class Singleton {private Singleton(){}private static Singleton instance;public static Singleton getInSingleton(){if(instance null){synchronized (Singleton.class) {if(instance null){instance new Singleton();}}}return instance;}}私有的构造方法不能别…

oracle数据库存大文本,Oracle大文本在ASP中存取问题的解决

一、关于ADO在基于Client/Server结构的数据库环境中&#xff0c;通过OLE DB接口可以存取数据&#xff0c;但它定义的是低层COM接口&#xff0c;不仅不易使用&#xff0c;而且不能被VB&#xff0c;VBA&#xff0c;VBScript等高级编程工具访问。而使用ADO则可以很容易地使VB等编程…

java桌面版_长大了Java! 提出Java桌面版

java桌面版不&#xff0c;这不是另一个“ Java已死”的咆哮。 Java非常活跃。 它是可用的最佳开发和运行时平台之一。 迄今为止&#xff0c;最稳定的平台。 那可能只是它最大的祸根。 荒谬&#xff01; 稳定性如何&#xff1f; 你可能会问。 好吧&#xff0c;您可以看到创新所带…

[原创]2014年上半年测试书籍推荐

[原创]2014年上半年测试书籍推荐 周末&#xff0c;打扫完屋子&#xff0c;趁着有空&#xff0c;也整理下自己在2014年上半年翻看的测试相关的书&#xff01; 1 书名&#xff1a; 《google软件测试之道》 图书地址&#xff1a;http://item.jd.com/11330792.html 推荐星级&#x…

PHP文件加到WordPress页面,WordPress-所有页面链接到index.php文件

[WORDPRESS上的新功能]我正在使用自己的CSS等创建自己的wordpress主题。我设法在index.php文件中获得了所有不错的东西, 而且我现在也尝试制作其他页面。当我制作home.php, blog.php, about.php和contact.php文件(在我的主题文件夹中)时, 它们没有链接到该文件。我遵循Lynda.co…

Android实现简单短信发送器

布局&#xff1a; <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:id"id/container"android:layout_width"match_parent"android:layout_heigh…

linux 查看文件哈希码,使用linux的sha1sum命令查看效验文件哈希值命令

服务器今天小编给大家分享的是使用linux的sha1sum命令查看效验文件哈希值命令&#xff0c;相信很多人都不太了解&#xff0c;为了让大家更加了解&#xff0c;所以给大家总结了以下内容&#xff0c;一起往下看吧。一定会有所收获的哦。sha1sum命令用于生成和校验文件的sha1值。它…

Java中的传值与传引用

曾经对java中传值还是传引用的问题十分困惑&#xff0c;而且也被问到过许多次&#xff0c;无论是面试&#xff0c;还是平时我们平时的讨论中。 在stackoverflow上面浏览时&#xff0c;无意中发现了跟这个问题有关的论题&#xff0c;于是深入地查看了&#xff0c;感觉获益匪浅&a…

java高性能序列化_Java最佳实践–高性能序列化

java高性能序列化在使用Java编程语言时&#xff0c;我们将继续讨论与建议的实践有关的系列文章&#xff0c;我们将讨论并演示如何将对象序列化用于高性能应用程序。 所有讨论的主题均基于用例&#xff0c;这些用例源于电信行业关键任务超高性能生产系统的开发。 在阅读本文的…

linux进程属主6,20150917 Linux进程查看与管理以及作业管理

第一、基础知识MBR引导--内核--内核程序--》协调其它程序一般内核运行在硬件之上&#xff0c;各应用也在硬件之前1)OS的基本功能&#xff1a;文件系统、网络功能、进程管理、内存管理、驱动程序、安全功能以上为通用目的设置的程序。&#xff0c;程序指令数据&#xff0c;程序运…

在javaweb中通过servlet类和普通类读取资源文件

javaweb有两种方式读取资源文件 在Servlet中读取&#xff0c;可以使用servletContext&#xff0c;servletContext可以拿到web所有的资源文件&#xff0c;然后随便读&#xff0c;但是这种方法不常用&#xff0c;尽量少在Servlet中读取资源文件 在普通Java类中&#xff08;DAO中&…

linux运行python脚本语句,如何在Linux下运行Python脚本

1、使用python的IDEL运行python如果你的Linux安装了python,CtrlAltT打开Terminal后输入指令&#xff1a;python,会出现>>>,这个时候就可以在里面输入python脚本开始运行了使用exit()退出python环境该环境下与MATLAB很像(1)查看python版本&#xff1a;python idle下面输…