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 易失性是否会阻止缓存或强制执行直写式缓存? 的相关文章

  • 如何为客户端和服务器缓存设置不同的缓存过期时间

    我想让某些页面为客户端提供 10 分钟缓存 为服务器提供 24 小时缓存 原因是如果页面发生变化 客户端将在 10 分钟内获取更新版本 但如果没有任何变化 服务器只需每天重建一次页面 问题在于输出缓存设置似乎覆盖了客户端设置 这是我的设置
  • 如何将日期字符串解析为Date? [复制]

    这个问题在这里已经有答案了 如何将下面的日期字符串解析为Date object String target Thu Sep 28 20 29 30 JST 2000 DateFormat df new SimpleDateFormat E
  • org.openqa.selenium.NoSuchSessionException:会话 ID 为空。调用 quit() 后使用 WebDriver?

    我已经进行了一些搜索 但仍然遇到同样的问题 我相信这可能是由于我的网络驱动程序是静态的造成的 我不太确定 在我的主课中 我包括了 BeforeTest and AfterTest BeforeTest包括根据我的 XML 文件启动新浏览器
  • NIO 直接缓冲区何时以及如何被释放?

    我有一个 C 库 需要一个临时缓冲区作为暂存空间 我正在考虑将直接字节缓冲区的地址传递给它 在最终释放缓冲区之前 是否允许虚拟机重新定位缓冲区 JNI 框架消失后 本机库将保留该指针 我的理解是 JNI 本地对象引用无法缓存 因为 VM 可
  • WSDL2Java 抛出无法找到主类:org.apache.axis.wsdl.WSDL2Java

    我正在尝试从远程 Web 服务创建 java 文件 我下载了axis 1 4 将lib文件夹复制到c data axis lib其中包含这些文件 axis jar 轴 ant jar commons discovery 0 2 jar co
  • Eclipse Oxygen - 该项目未构建,因为其构建路径不完整

    我刚刚安装了 Eclipse Oxygen 并尝试在工作台中打开现有项目 但收到此错误 该项目未构建 因为其构建路径不完整 不能 找到 java lang Object 的类文件 修复构建路径然后尝试 建设这个项目 我尝试右键单击该项目 转
  • SSLContext 初始化

    我正在看JSSE参考指南 我需要获取一个实例SSLContext为了创建一个SSLEngine 所以我可以使用它Netty以启用安全性 获取实例SSLContext I use SSLContext getInstance 我看到该方法被重
  • java.lang.ClassNotFoundException: org.jboss.logging.Logger

    我有一个奇怪的问题 我有一个JMS https en wiktionary org wiki JMS客户端应用程序和MDB https en wikipedia org wiki Enterprise JavaBeans Message d
  • 用于 Eclipse 的 Resharper [关闭]

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

    我正在使用 Jersey 和 Spring 3 2 以及 Open CMIS 开发 RESTful Web 服务 我没有使用 Spring 的 MVC 模式 它只是 Spring IOC 和 Jersey SpringServlet 控制器
  • SLURM 节点、任务、核心和 CPU

    有人能够澄清这些东西到底是什么吗 据我所知 节点是集群内的计算点 本质上是一台计算机 任务是可以在单个节点或多个节点上执行的进程 核心基本上是指您希望在单个节点上分配多少 CPU 来执行分配给该 CPU 的任务 它是否正确 我混淆了什么吗
  • Java DNSLookup MX 记录列表。类似于 MXToolBox

    我正在构建一个程序来列出域的所有 MX 记录 起初似乎工作正常 但与在线工具进行比较后http mxtoolbox com http mxtoolbox com 有些域程序无法获取 MX 记录 而 MXToolbox 可以 我不确定原因是什
  • 带等待/通知的同步块与不带等待/通知的同步块之间的区别?

    如果我只是使用synchronized 不是wait notify方法 它仍然是线程安全的吗 有什么不同 Using synchronized使方法 块一次只能由一个线程访问 所以 是的 它是线程安全的 这两个概念是结合在一起的 而不是相互
  • 对于双核手机,availableProcessors() 返回 1

    我最近购买了一部 Moto Atrix 2 手机 当我尝试查看手机中的处理器规格时 Runtime getRuntime availableProcessors 返回 1 proc cpuinfo 也仅包含有关处理器 0 的信息 出于好奇
  • Eclipse 如何创建一个未解决编译问题的类?

    当我尝试使用 javac 编译此类时 出现编译错误并且未创建 Test class public class Test public static void main String args int x 1L lt this cannot
  • java mysql 准备好的语句

    我正在尝试使用 java 向数据库中进行简单的插入 它告诉我我的 sql 语法已关闭 但是 当我复制打印出来的字符串并将其放入 phpmyadmin 中的 sql 命令中时 它会正确执行该命令 并且我似乎无法弄清楚 java 中的字符串查询
  • 在 servlet 会话和 java.io.NotSerializedException 中保存对象

    SEVERE IOException while loading persisted sessions java io WriteAbortedException writing aborted java io NotSerializabl
  • 将 SQL 数据中的一行映射到 Java 对象

    我有一个 Java 类 其实例字段 以及匹配的 setter 方法 与 SQL 数据库表的列名相匹配 我想优雅地从表中获取一行 到 ResultSet 中 并将其映射到此类的实例 例如 我有一个 Student 类 其中包含实例字段 FNA
  • 将其元素添加到另一个列表后清除列表

    我正在做一个程序 它获取更多句子作为参数 我制作了 2 个列表 一个称为 propozitie 其中包含每个句子 另一个称为 propozitii 其中包含所有句子 问题是 当我在遇到 后清除 propozitie 列表时 它也会清除 pr
  • removeall 和removeif 的用例

    我找到了这个 fun main val list MutableList

随机推荐

  • 访问 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