Java内存模型:编译器重新排列代码行

2024-02-03

众所周知,Java 语言允许编译器重新排列已编译代码行,只要重新排序对代码语义没有影响即可。然而,编译器只需关心语义,如从当前线程。如果这种重新排序影响多线程情况下的语义,通常会导致并发问题(内存可见性)

我的问题:

  1. 通过允许编译器使用这个 freedm 可以实现什么目的?编译器真的有可能通过重新排列代码来生成更有效的代码吗?我还没有看到这方面的实际案例。我有时觉得这样做带来的并发风险远远超过了好处(如果有的话)。

  2. 程序员有什么方法可以告诉编译器不要像这样重新排列行吗?我知道使用同步原语可以有效地处理重新排列的副作用,但我问是否有任何直接的方法(编译器选项)来关闭它?


The javac编译器几乎没有执行任何优化。

JIT 本机编译器可以在存在内存排序问题的情况下重新排序指令。然而,CPU 也可以重新排序指令和内存更新,这具有相同的效果。

通过允许编译器使用这个 freedm 可以实现什么目的?

主要好处是代码可移植性。您提供的保证越多,确保每个平台真正做到这一点就越困难。

通过允许 CPU 在可以执行指令时而不是严格按照指令执行指令,还可以显着提高性能。

编译器真的有可能通过重新排列代码来生成更有效的代码吗?

是的。但 CPU 进行的重新排序更为重要。

我还没有看到这方面的实际案例。我有时觉得这样做带来的并发风险远远超过了好处(如果有的话)。

程序员有什么方法可以告诉编译器不要像这样重新排列行吗?

这就是为什么你使用内存屏障,例如volatile, synchronized块和Lock。当您使用这些时,您将获得线程安全保证。

我知道使用同步原语可以有效地处理重新排列的副作用,但我问是否有任何直接的方法(编译器选项)来关闭它?

您可以关闭 JIT,但大多数重新排序是由 CPU 完成的,因此不会有太大效果。

避免更新的重新排序只是线程安全问题的一小部分(它最大的问题是模糊且很少发生,这使得测试变得困难)并且一旦编写了线程安全代码,这个问题就会得到缓解。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java内存模型:编译器重新排列代码行 的相关文章

  • 将 WAR 部署到 Tomcat(Spring Boot + Angular)

    我正在尝试使用以下命令部署 Spring Boot 应用程序WAR包装至Tomcat 10 应用程序已成功部署 但是 当我尝试访问端点时 它会导致404 未找到 战争文件 应用程序 war http localhost 8080 appli
  • 在Java Servlet中获取通过jquery ajax发送的参数[重复]

    这个问题在这里已经有答案了 我在网上搜索这个主题 但找不到有效的示例 我会很高兴有人能给我帮助 这就是我测试的 ajax url GetJson type POST dataType json contentType application
  • 从 Android 函数更新 Textview

    有人可以告诉我如何从函数更新 Android Textview 控件吗 我在互联网上进行了深入搜索 看到很多人都问同样的问题 我测试了线程但无法工作 有人有一个简单的工作示例吗 例如 调用一个函数 在循环中运行多次 并且该函数在 TextV
  • openFileOutput 在单例类中无法正常工作 - 想法/解决方法?

    作为一名 Android 开发新手 我遇到了一些奇怪的问题 我想创建一个类 它方法其他类 活动 任何可以用于以某种特殊方式处理文件的类 假设为了简单起见 我们将记录一些内容 如果我在活动中执行以下操作 例如在 OnClick 侦听器中 则一
  • java中高效的输入流到字符串方法

    因此 我在 Java 中的 诚然非常简单 应用程序上运行探查器 令我惊讶的是 仅次于需要在时间上发出 HTTP 请求的方法的是我的方法 inputStreamToString方法 目前它的定义如下 public static String
  • Android Studio 与 Google Play 服务的编译问题

    我正在运行 Android Studio 0 8 4 并在 Android Studio 0 8 2 上尝试过此操作 我正在运行 Java JDK 1 8 0 11 并尝试使用 JDK 1 8 0 05 每当我尝试构建我的 android
  • 使用 Spring MVC 在 jar 文件中显示 jsp 页面

    我正在使用 Spring MVC 3 2 2 在 java 中开发一个 Web 应用程序 我在从 jar 文件中加载 jsp 页面时遇到问题 Spring MVC Web应用程序具有以下结构 META INF WEB INF spring
  • Spring Data Jpa OneToMany 同时保存子实体和父实体?

    这是我的父实体 注意 为了简洁起见 删除了 getter setter lombok 注释 Entity public class Board Id GeneratedValue strategy GenerationType IDENTI
  • 无法在 Intellij 中运行主类[重复]

    这个问题在这里已经有答案了 我有以下项目结构 ProjectRoot src Main examples libs My src文件夹被标记为sources在 Intellij 中 现在 当我想运行 Main 类时 出现以下错误 Excep
  • 如何杀死 Java Future?

    我正在开发的服务使用 Future 来并行运行多个任务 每个任务最多可能需要一分钟才能完成 然而 外部库似乎有问题 因为在某些情况下 2 的时间 它不会返回 在这些情况下 我想给出 2 分钟的等待时间 如果还没有返回 我想杀死 future
  • 用于制作代码编辑器的 JavaFX 相当于 JSyntaxPane 的什么?

    以前在 Swing 中 我使用过JSyntaxPane用于制作一个小型 Java 源代码编辑器 为了练习 我决定用 JavaFX 重做整个项目并添加对更多语言的支持 最好是尽可能多 不过好像没有什么类似的JSyntaxPane 一些研究让我
  • Google 表格使用 API 密钥而不是 client_secret.json

    In the QuickStart java示例Java 快速入门 https developers google com sheets api quickstart java他们使用OAuth client ID识别该应用程序 这会弹出一
  • 如何检查单词是否在wordNet中

    我开始了解wordNet直到我知道我找到了synonymous对于一个特定的词 现在我有一个文件 我想使用标记化该文本n gram例如 String s I like to wear tee shirt 使用后n gram这将是 I lik
  • 始终将双精度舍入

    我怎么总是能把一个double to an int 并且永远不要将其四舍五入 我知道Math round double 但我希望它始终向上舍入 所以如果是的话3 2 四舍五入为 4 您可以使用Math ceil method 请参阅Java
  • 线程数组?

    所以我在理解如何避免线程的顺序执行时遇到了问题 我试图创建一个线程数组并在单独的循环中执行 start 和 join 函数 这是我现在拥有的代码示例 private static int w static class wThreads im
  • 在 Tensorflow-lite Android 中将位图转换为 ByteBuffer(浮点)

    在用于图像分类的tensorflow lite android演示代码中 图像首先转换为ByteBuffer格式以获得更好的性能 这种从位图到浮点格式的转换以及随后到字节缓冲区的转换似乎是一个昂贵的操作 循环 按位运算符 float mem
  • Spring MVC:通用 DAO 和服务类

    我正在 Spring MVC 中编写网页 我使用 Generic DAO 编写了所有 DAO 现在我想重写我的服务类 我该如何写 通用服务 我的 DAO 如下 DAO package net example com dao import j
  • 使用 Hibernate Envers 的复合表

    我有一个带有复合表的应用程序 其中包含一个额外的列 一切正常 直到我们添加 Hibernate Envers Audited org hibernate MappingException 无法读取 no pack response Resp
  • junit4 使用特定测试方法创建测试套件

    在 junit4 中 我想执行来自不同类的特定测试方法 即想要使用来自不同类的特定测试方法创建一个测试套件 假设我有两门课 public class Test Login Test public void test Login 001 Sy
  • MyBatis 枚举的使用

    我知道以前有人问过这个问题 但我无法根据迄今为止找到的信息实施解决方案 所以也许有人可以向我解释一下 我有一个表 状态 它有两列 id 和 name id是PK 我不想使用 POJO Status 而是使用枚举 我创建了这样一个枚举 如下所

随机推荐

  • Gson 仅在不为 null 或不为空时序列化字段

    我有一个需求 需要将 java 对象转换为 json 我正在使用 Gson 但我需要转换器仅序列化非空或非空值 例如 my java object looks like class TestObject String test1 Strin
  • unicode 输出 java windows cmd

    我是java新手 所以请原谅我 如果这是常见的知识 但我已经努力搜索 但找不到任何有用的 相关的或可理解的东西 考虑到我是一个C开发人员 这很奇怪 我的问题是 如何让java在Windows shell中打印Unicode字符串 为简单起见
  • 处理 Tornado 中未定义的模板变量

    这是一个龙卷风模板 例如 在文件 logout html 中 我在注销过程中出现错误时呈现 if logout error Oops The logout failed Please close all open documents and
  • android 点击劫持,如何防止它

    试图避免我的观点涉及从覆盖层接收反馈 以下是某人在 Android 上进行的黑客攻击示例 允许用户无意中按下系统按钮属性 甚至输入凭据来执行与最初意图完全不同的操作 http www youtube com watch v gCLU7YUX
  • 在Python中获取文件关联

    我想要在 Linux 和 Windows 中获取与扩展关联的程序 我知道我可以在 Linux 中执行 xdg open 或在 Windows 中启动 但我要在远程服务器上打开媒体文件 因此使用此方法将打开网络浏览器 而不是默认媒体播放器 如
  • 运行 R 脚本 - Ubuntu 服务器

    我最近在 Ubuntu Server 16 04 上编译了 R 我尝试使用 Rscript 函数运行 R 脚本 但遇到错误 当我使用运行脚本时Rscript 输出显示功能as and new 无法找到 R 发行版中包含的方法包中的内容 当我
  • HTML5 必需属性不起作用

    我想创建一个电子邮件联系表单而不刷新页面 所以我在我的 html 文件中添加了 jquery 我使用 html required 属性检查字段是否为空 但是当我在我的 html 代码中添加 jquery 代码时 required 属性不起作
  • 使用未指定的索引。考虑添加 ".indexOn": "g"

    我正在使用 Geofire 在某个区域进行循环查询 设置好观察者后 我会返回位置 但是 随着位置的变化 我还会返回 使用未指定的索引 考虑添加 indexOn g 我的 geofire 数据库看起来像这样 karmadots geofire
  • 将正方形分割成小正方形

    我有一个大广场 我想把这个正方形分成小正方形 我需要所有可能的组合 我知道组合有无数种 但我有一个限制 我有最小正方形的固定尺寸 我可以使用蛮力来实现它 但它太长了 对于这个任务有更好的算法吗 Thanks 那么这个问题只有当我们做出两个假
  • 尝试理解 Ruby 中 self.method_name 与 Classname.method_name 的使用

    我试图了解何时使用 self method name 与何时使用 Classname method name 在下面的示例中 为什么 before create 需要引用 User hash password 而不是 self hash p
  • Apache:如何对用户隐藏服务器版本和操作系统?

    我在一个网站上读到我需要添加两行httpd conf file 服务器签名关闭 ServerTokens 产品 但当我添加它们后 一切都没有改变 正如之前我可以在浏览器中看到的 Apache 2 2 16 Debian 也许这很重要 当我打
  • 默认的 VB6 字符集是什么?

    我们有一个用 Java 编写的应用程序 它读取 VB6 应用程序生成的一些文本 问题是 这个 VB6 应用程序使用一些特殊字符生成此输出 例如 我们不知道这些字符采用什么字符集 那么问题来了 VB6有没有使用默认的字符集 是哪一个 如何将数
  • 如何通过新的 V2 API 使用 Google Translate TTS?

    我曾经使用以下网址调用 Google Translate TTS 下载音频文件 然而谷歌改变了工作方式 因此我无法再下载音频文件 我已注册 Google Translate API V2 免费试用版 但找不到如何获取 TTS 音频文件 任何
  • Android 4.0.3 (MIUI ROM) 下未加载本机库

    一位客户联系我 当他将 Android ROM 更新到相当于 Android 4 0 3 的 MIUI 时 我的 Android 应用程序崩溃了 LogCat 中的相关行是 04 09 10 37 09 326 17789 17789 E
  • 在 OS X Lion 10.7.4 和 Python 3.2.2 上安装 MatPlotLib 1.2.x

    几天前我问了一个关于在同一系统上安装 numpy 的问题 值得庆幸的是 我自己设法解决了这个问题 但不幸的是我现在陷入了尝试安装 matplotlib 的困境 我首先尝试了当前的分布式版本 但没有成功 所以我想我应该下载 git 存储库并尝
  • 函数模板重载解析和编译器优化

    我正在看这里发现的这个问题包含类型的类型的模板函数重载 https stackoverflow com questions 44511121 template function overload for type containing a
  • 将数据存储为 flutter 中共享首选项中的对象

    我想在共享首选项中存储一个对象 其中包含一些字段 如姓名 年龄 电话号码等 我不知道如何在颤振中的共享首选项中存储对象 您可以将对象存储在共享首选项中 如下所示 SharedPreferences shared User await Sha
  • 使用 EDITBIN 时的错误代码 -1073741515

    我正在使用 EditBin 来增加我正在编写的应用程序的堆栈大小 我在 Visual Studio 的构建后事件命令行中包含以下内容 C Program Files x86 Microsoft Visual Studio 10 0 VC b
  • 如何使我的网站符合 PCI 标准

    假设我决定使用支付网关而不是使用他们的托管页面 而是提供我自己的信用卡详细信息表单 然后通过 xml 将数据发送到他们的后端 如下所示本页有解释 http www eway com au Developer eway api hosted
  • Java内存模型:编译器重新排列代码行

    众所周知 Java 语言允许编译器重新排列已编译代码行 只要重新排序对代码语义没有影响即可 然而 编译器只需关心语义 如从当前线程 如果这种重新排序影响多线程情况下的语义 通常会导致并发问题 内存可见性 我的问题 通过允许编译器使用这个 f