Java 易失性是否会阻止缓存或强制执行直写式缓存?

2024-01-09

我正在尝试理解Javavolatile关键词关于writing具有 CPU 缓存的多线程程序中的易失性原子变量。

我读过一些教程和 Java 语言规范,特别是第 17.4.5 节“在订购之前发生” http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.4.5。我的理解是,当线程将新值写入易失性变量时,更新的值必须对读取该变量的其他线程可见。对我来说,这些语义可以通过以下两种方式之一实现:

  1. 线程可以在 CPU 缓存中缓存易失性变量,但对缓存中变量的写入必须立即刷新到主内存。换句话说,缓存是直写式 https://en.wikipedia.org/wiki/Cache_(computing)#WRITEPOLICIES.

  2. 线程永远不能缓存易失性变量,并且必须在主内存中读取和写入此类变量。

这里提到了方法1tutorial http://tutorials.jenkov.com/java-concurrency/volatile.html (http://tutorials.jenkov.com http://tutorials.jenkov.com) 说的是:

通过将计数器变量声明为易失性,所有写入计数器 变量将立即写回主存。

Stackoverflow问题中提到了方法2“Java中的易失性变量 https://stackoverflow.com/questions/6259745/volatile-variable-in-java“还有这个tutorial http://www.javamex.com/tutorials/synchronization_volatile.shtml说的是:

该变量的值永远不会在线程本地缓存:全部 读取和写入将直接进入“主存储器”

Java 中使用的正确方法是哪一种?

相关的 Stackoverflow 问题not回答我的问题:

Java中的易失性变量 https://stackoverflow.com/questions/6259745/volatile-variable-in-java

Java 易失性读取是否刷新写入,以及易失性写入是否更新读取 https://stackoverflow.com/questions/35808193/does-java-volatile-read-flush-writes-and-does-volatile-write-update-reads

Java 易失性和缓存一致性 https://stackoverflow.com/questions/21129018/java-volatile-and-cache-coherence


这些保证只是您在语言规范中看到的。理论上,写入易失性变量可能会强制将缓存刷新到主内存,也可能不会,可能后续读取会强制缓存刷新,或者以某种方式导致在没有缓存刷新的情况下在缓存之间传输数据。这种模糊性是故意的,因为它允许未来潜在的优化,如果更详细地阐明易失性变量的机制,这些优化可能是不可能的。

实际上,对于当前的硬件,这可能意味着,在缺乏一致缓存的情况下,写入易失性变量会强制将缓存刷新到主内存。当然,对于一致的缓存,不需要这样的刷新。

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

Java 易失性是否会阻止缓存或强制执行直写式缓存? 的相关文章

  • 无法在类对象的 ArrayList 中存储值。 (代码已编辑)

    这基本上是一个 Java 代码转换器 它涉及一个 GUI 让用户输入类类型 名称和方法 为了存储值 我创建了一个类VirtualClass与ArrayList
  • 防止 Spring Boot 注册 Spring Security 过滤器之一

    我想禁用安全链中的 Spring Security 过滤器之一 我已经看到了防止 Spring Boot 注册 servlet 过滤器 https stackoverflow com questions 28421966 prevent s
  • 哪个 Swing 布局管理器可以获得我想要的布局?

    我正在尝试按照这个模型制作一个基本的登录菜单 我决定将整个菜单放入 JPanel 中 以便在连接成功后我可以切换到另一个面板 所以我决定使用 Borderlayout 将标题放在北区 将连接按钮放在南区 我将边框布局的中心本身设置为面板 我
  • RMI 中的引用传递问题? [复制]

    这个问题在这里已经有答案了 有人可以告诉我我错在哪里 为什么这个 RMI 聊天应用程序不起作用 目标是通过远程对象或序列化对象实现客户端 服务器和逻辑之间的解耦 import javax swing import java awt even
  • 尝试使用 JRI 将 R 与我的 Java 应用程序集成,但出现错误。谁能解释一下原因和解决办法吗?

    我需要将 Java 与 R 集成来运行一些数学命令并使用 R 的功能进行绘图 以下部分代码给出了错误 public static void main String args HelloRWorld r new HelloRWorld r h
  • 定期更新 SWT 会导致 GUI 冻结

    Problem 当 GUI 字段定期更新时 SWT 会冻结 我想要一个基于 SWT 的 GUI 其中文本字段的值会定期递增 最初我从单独的线程访问 textField 导致抛出异常 线程 Thread 0 org eclipse swt S
  • 有多少种方法可以将位图转换为字符串,反之亦然?

    在我的应用程序中 我想以字符串的形式将位图图像发送到服务器 我想知道有多少种方法可以将位图转换为字符串 现在我使用 Base64 格式进行编码和解码 它需要更多的内存 是否有其他可能性以不同的方式做同样的事情 从而消耗更少的内存 现在我正在
  • Jenkins 的代码覆盖率 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 发生错误。请参阅日志文件 - eclipse juno

    每当我启动 Eclipse Juno 时 都会出现错误 发生错误 请查看日志文件 C Program Files eclipse configuration 1362989254411 log 有的网站说卸载jdk重新安装 我这样做了 但没
  • 在 Java 中将弯音发送到 MIDI 音序器

    我了解启动和运行 MIDI 音序器的基础知识 并且希望能够在播放过程中增加 减小序列的音高 但弯音是发送到合成器而不是音序器的消息 我尝试将音序器的接收器设置为合成器的发射器 当我发送弯音短消息时 音序器保持相同的音调 但随后合成器以新的弯
  • 使用连接池后如何处理过多的并发连接?

    Scenario 假设您有一个拥有大量流量的网站或应用程序 即使使用数据库连接池 性能也会受到真正的打击 站点 应用程序甚至可能崩溃 因为并发连接太多 Question 人们有什么选择来处理这个问题 我的想法 我在想有这个问题的人可以创建多
  • 改变for循环的顺序?

    我遇到一种情况 我需要根据用户输入以不同的顺序循环遍历 xyz 坐标 所以我是 3D 空间中的一个区域 然后是一组像这样的 for 循环 for int x 0 x lt build getWidth x for int y 0 y lt
  • JavaFX - 为什么多次将节点添加到窗格或不同的窗格会导致错误?

    我现在正在学习基本的 JavaFX 我不明白我正在阅读的书中的这一说法 不 诸如文本字段之类的节点只能添加到一个窗格中一次 将节点添加到多次窗格或不同的窗格将导致运行时错误 我可以从书中提供的UML图看出它是一个组合 但我不明白为什么 库类
  • 为什么我的代码会产生错误:该语句没有返回结果集[重复]

    这个问题在这里已经有答案了 我正在从 Microsoft SQL Server Studio 执行以下查询 该查询工作正常并显示结果 SELECT INTO temp table FROM md criteria join WHERE us
  • 使用 secp256r1 曲线和 SHA256 算法生成 ECDSA 签名 - BouncyCastle

    我正在尝试使用带有 secp256r1 曲线 P256 的 ECDSA 和用于消息哈希的 SHA256 算法生成签名 我也在使用 Bouncy Castle 库 下面的代码 public class MyTest param args pu
  • 如何用表达式语言获取布尔属性?

    如果我有一堂这样的课 class Person private int age public int getAge return age public boolean isAdult return age gt 19 我可以得到age像这样
  • 防止Java实例化的正确方法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 模拟pytest中的异常终止

    我的多线程应用程序遇到了一个错误 主线程的任何异常终止 例如 未捕获的异常或某些信号 都会导致其他线程之一死锁 并阻止进程干净退出 我解决了这个问题 但我想添加一个测试来防止回归 但是 我不知道如何在 pytest 中模拟异常终止 如果我只
  • 为什么范围为“provided”的依赖项会隐藏 Maven 中的传递依赖项?

    我的 Maven 项目中有三个模块 这稍微简化了 model包含JPA注释的实体类 坚持实例化一个实体管理器并调用它的方法 应用创建类的实例model 设置一些值并将它们传递给坚持 model and 坚持显然取决于javax persis
  • 如何在不同版本的Google App Engine中使用自定义域名?

    我使用谷歌应用程序引擎作为我的 Android 和 Web 应用程序的服务器 我使用 Android Studio 开发了 Android 应用程序 并使用 Eclipse 开发了 Web 应用程序 我在应用程序引擎中部署了两个版本 第一个

随机推荐

  • 访问 Outlook Exchange 全球地址簿

    我正在构建一个 csharp 应用程序 我想要一个包含我的所有用户的下拉列表Outlook 全球地址簿 当我从 Outlook gui 单击 收件人 时也是如此 是否可以获取此程序 这里的安全要求是什么 过去 除了 Outlook 依赖性之
  • 调整 3D 图像大小(并重新采样)

    我有大脑的 3D 图像 我们称之为 flash 当前尺寸为 263 x 256 x 185 我想将其大小调整为另一个图像的大小 称之为 Whole brain bravo 256 x 256 x 176 并且 希望 使用 lanczos 插
  • Github Actions 徽章显示“无状态”

    GitHub Actions 徽章出现问题 我有三个工作流程 https github com riZZZhik belinsky tree master github workflows在我的存储库中 我正在努力让他们的徽章进来Readm
  • 将日期格式更改为 yyyy-mm-dd

    我有一个日期列 其中包含混合格式的日期 例如 A 1990年3月21日1990年3月21日 因此 基本上一列中有两种不同的格式 dd mm yyyy and mm dd yyyy 我正在尝试编写一个 VBA 脚本来将列中所有日期的格式更改为
  • 带有 JSON 补丁的 GraphQL 突变

    GraphQL 中是否有任何数据类型可用于描述 JSON Patch 操作 JSON Patch 操作的结构如下 op add replace remove path hello value world Where value可以是任何有效
  • 如何在没有 Grails 的情况下创建 GSP 标记库

    我们可以在没有 Grails 的情况下使用 GSP 只需映射 servletgroovy servlet TemplateServlet 那么 TagLib 又如何呢 Here are http grails org doc latest
  • 从 Google 云端硬盘下载图像文件

    我正在将图像文件上传到 Google Drive SDK 然后尝试下载回相同的图像 我查看了 Google Drive Developer 示例中下载文件的示例 但它们仅向我们展示了如何从文件中下载文本 我该如何下载图像 该文件是 Goog
  • htmlpurifier 删除内联 css

    我正在使用 htmlpurifier 来清理用户内容 我正在尝试删除内联样式属性 例如 div some text div 我想删除整个样式属性 如何使用 htmlpurifier 做到这一点 您可以调整允许的属性 http htmlpur
  • 用于删除所有用户桌面上的所有图标的批处理脚本

    目前正在寻找一种方法来删除所有用户桌面上的所有图标 我一直在尝试 直到我制作了以下脚本 该脚本允许我从单个用户中删除所有内容 但如果没有硬编码 我将无法扩展它以覆盖单个 PC 上的所有用户 echo off cd del C Users U
  • 通过启动进程运行 cmd.exe 但无法将命令传递给 cmd.exe

    我想运行一个常规脚本cmd exe在不同的用户下 我用过Start Process 当脚本执行时 它只是用不同的用户在屏幕上打开提示 但不处理 command 所以我的问题是 运行后如何传递命令cmd exe使用 PowerShell 这是
  • Gmail 作为 JavaMail SMTP 服务器

    我一直在使用 JavaMail API 以 Gmail 作为我的主机 并对如何使用它发送电子邮件有一个大致的了解 但有两行代码仍然让我困惑 message setFrom new InternetAddress USERNAME API 表
  • 条件面板闪亮(似乎不起作用)

    有人可以帮我解决以下闪亮的问题吗 我需要制作一个条件面板 但在这里我不希望它出现 除非有人选择女性 然而 当我运行此代码时 条件面板出现在页面中 任何帮助都感激不尽 selectInput gender What is your gende
  • 检测 mysqli 准备好的语句中的错误[重复]

    这个问题在这里已经有答案了 我有一个自定义错误处理程序 但我需要知道在准备好的语句中测试错误的位置 我有测试吗prepared bind execute and store result 阶段还是仅选择阶段 statement databa
  • 为什么 StackPanel 不垂直拉伸其子级?

    WPF 新手 我正在查看 WPF 示例
  • 如何清理 InlineFormSet 中的某个字段?

    我需要清理内联表单集中的特定字段 但我不知道该怎么做 我尝试过使用表单集def clean self 方法但不知道在哪里保存清理后的值 如果我尝试将清理值设置为forms 0 data field 我收到 此 QueryDict 实例是不可
  • Laravel 5 应用程序始终使用“测试”环境配置

    我有一个 Laravel 5 应用程序 它有两个环境和两个配置 测试 用于 PHPUnit 配置 内存数据库 和本地 我的开发配置 即使环境配置为local 应用程序仅加载配置resources config testing文件夹 我可以从
  • 如何在 Windows 上配置 theano?

    我已经在 Windows 机器上安装了 Theano 并按照配置进行操作指示 http deeplearning net software theano library config html 我将以下 theanorc txt 文件放置在
  • 如何在 G Suite 上通过同意屏幕请求全域委派

    我需要访问公司的日历信息G Suite账户 通过API与公司系统同步数据 当我需要提供对我自己的数据的访问时 有一个相当好的方法简单的方法 https developers google com calendar auth去做吧 使用 Oa
  • 使用 tcpdump 监控流量时丢失 UDP 片段

    我所在的本地 LAN 上只有 8 台连接的计算机 使用 netgear 24 端口千兆位交换机 网络负载非常低 所有相关节点 运行 slackware 11 上的发送 接收缓冲区已设置为 16mb 我还在每个节点上运行 tcpdump 来监
  • Java 易失性是否会阻止缓存或强制执行直写式缓存?

    我正在尝试理解Javavolatile关键词关于writing具有 CPU 缓存的多线程程序中的易失性原子变量 我读过一些教程和 Java 语言规范 特别是第 17 4 5 节 在订购之前发生 http docs oracle com ja