为什么 Java 中的 volatile 不更新变量的值?

2023-12-12

我读过Java中的“易失性”允许不同的线程访问同一字段并查看其他线程对该字段所做的更改。如果是这种情况,我预测当第一个和第二个线程完全运行时,“d”的值将增加到 4。但相反,每个线程都会将“d”增加到值 2。

public class VolatileExample extends Thread {
private int countDown = 2;
private volatile int d = 0; 

    public VolatileExample(String name) {
        super(name);
        start();
    }

    public String toString() {
       return super.getName() + ": countDown " + countDown;
    }

public void run() {
        while(true) {
        d = d + 1;
    System.out.println(this + ". Value of d is " + d);
    if(--countDown == 0) return;
    }
}

public static void main(String[] args) {
    new VolatileExample("first thread");
    new VolatileExample("second thread");
    }
}

运行该程序的结果是:

第一个线程:倒计时 2. d 的值为 1

第二个线程:倒计时2。d的值为1

第一个线程:倒计时 1。d 的值为 2

第二个线程:倒计时 1。d 的值为 2

我知道如果我在程序中添加关键字“static”, (即“private static volatile int d = 0;”),“d”将增加到 4。 我知道这是因为 d 将成为整个类共享的变量,而不是每个实例都获得一个副本。

结果如下:

第一个线程:倒计时 2. d 的值为 1

第一个线程:倒计时 1。d 的值为 3

第二个线程:倒计时 2。d 的值为 2

第二个线程:倒计时 1。d 的值为 4

我的问题是,如果 volatile 应该允许在两个线程之间共享“d”,为什么“private volatile int d = 0;”不会产生类似的结果?也就是说,如果第一个线程将 d 的值更新为 1,那么为什么第二个线程不将 d 的值获取为 1 而不是 0?


易失性不允许“共享”任何东西。它只是防止变量在线程本地缓存,以便变量值的更改立即发生。您的 d 变量是一个实例变量,因此由保存它的实例拥有。您需要重新阅读线程教程以重新调整您的假设。

一个不错的参考是here

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

为什么 Java 中的 volatile 不更新变量的值? 的相关文章

  • 将一种类型的对象声明为另一种类型的实例有什么好处? [复制]

    这个问题在这里已经有答案了 可能的重复 Base b2 new Child 是什么意思 表示 https stackoverflow com questions 4447924 what does base b2 new child sig
  • 如何使用 Maven Failsafe 插件运行 JUnit 5 集成测试?

    当我运行命令时 Maven Failsafe 插件找不到我的 JUnit 5 集成测试mvn clean failsafe integration test 尽管它可以找到文件 我有junit jupiter api and junit j
  • 如何提取文件 jre-9/lib/modules?

    In JRE 9 lib目录 至少在 Windows 上 有一个名为modules其大小约为107 MB 是否可以提取该文件或在其中列出 java 模块 我可以看到一个名为jmod可以在jdk 9 bin jmod exe 但那是为了阅读
  • GET 请求的 Spring 注解

    这两种spring GET方法有什么区别呢 哪一种是首选方法 Component Scope request Path public class TestComponent GET Path hello public String prin
  • 如何在Java中优雅地处理SIGKILL信号

    当程序收到终止信号时如何处理清理 例如 我连接到一个应用程序 希望任何第三方应用程序 我的应用程序 发送finish注销时的命令 发送该信息最好说什么finish当我的应用程序被破坏时的命令kill 9 编辑1 kill 9无法被捕获 谢谢
  • 项目缺少所需的注释处理库

    我的 Eclipse IDE 突然在问题视图中显示 xxxx 项目缺少所需的注释处理库 xxxx M2 REPO 中的一些旧 jar 我用谷歌搜索 没有找到任何答案 为什么我的项目使用旧的 jar 以及错误来自哪里 To remove th
  • 尝试写一个无锁的单链表,麻烦去除

    我正在尝试编写一个无锁单链表 最终一致性不是问题 有人遍历可能包含不正确项目的列表 我认为我正确添加了项目 循环和Interlocked CompareExchange 但我不知道如何删除节点 列表中的任何位置 因为我必须获取前一个项目并设
  • 检查 IPv4 地址是否在私有范围内

    在 Python 中 使用 IPy 模块您可以执行以下操作 gt gt gt ip iptype PRIVATE 有没有一个库或简单的方法可以在 Java 中执行相同的操作 似乎不完全是但是InetAddress有一些 isXX 方法 例如
  • java中的单链表和双向链表?

    在java中 哪个集合接口可以有效地实现单链表和双向链表 请问代码示例吗 毫不奇怪 实现双向链表的正确接口是 LinkedList 看Java文档 http docs oracle com javase 8 docs api java ut
  • Kafka Java Consumer 已关闭

    我刚刚开始使用卡夫卡 我面临着消费者的一个小问题 我用Java写了一个消费者 我收到此异常 IllegalStateException 此消费者已关闭 我在以下行中遇到异常 ConsumerRecords
  • 当 JMS Prod 位于辅助 POJO 类中时,如何在事务中包含 JMS Producer

    简短的问题 有没有办法强制无状态 EJB 调用的 POJO 存在于 EJB 的上下文中 以便事务和资源注入可以在 POJO 中工作 具体来说 在我想要做的事情的上下文中 如何在 EJB 的事务中包含 POJO JMS 生产者 该生产者在调用
  • 关于Java泛型的一些问题

    假设我有以下接口和实现类 interface Foo
  • 从 Android 访问云存储

    我一直无法找到任何有关如何从 Android 应用程序使用云存储的具体文档 我确实遇到过这个客户端库 https cloud google com storage docs reference libraries然而 Google Clou
  • Android 解析 JSON 卡在 get 任务上

    我正在尝试解析一些 JSON 数据 我的代码工作了一段时间 我不确定我改变了什么突然破坏了代码 当我运行代码时 我没有收到任何运行时错误或警告 我创建一个新的 AsyncTask 并执行它 当我打电话时 get 在这个新任务中 调试器在此行
  • JAXB 编组器无参数默认构造函数

    我想从 java 库中编组一个 java 对象 当使用 JAXB marschaller 编组 java 对象时 我遇到了一个问题 A 类没有无参数默认构造函数 我使用Java Decompiler来检查类的实现 它是这样的 public
  • Java:一个函数有多种返回类型...可以使用泛型吗?

    为了简单起见 我有一些程序 如下所示 public String fetchValueAsString String key public DateTime fetchValueAsDateTime String key 我想要类似的东西
  • Java String ReplaceAll 方法给出非法重复错误?

    我有一个字符串 当我尝试运行时replaceAll方法 我收到这个奇怪的错误 String str something op str str replaceAll o n it works fine str str replaceAll n
  • 传递 Android DialogFragment 参数时,onCreateDialog 捆绑参数意外为 null

    我正在尝试使用 DialogFragment 在 Android 中显示一个基本对话框 并使用对话框消息的参数 如中所述StackOverflow线程 https stackoverflow com questions 15459209 p
  • 如何使用注释处理 Hibernate 和 Spring 中的连接查询?

    我正在使用 Spring 和 Hibernate 以及 MySQL 开发应用程序 我是 Hibernate 新手 完成了基本任务 现在我需要在选择查询中应用联接以使用注释从多个表中获取数据 我已经搜索过但仍然没有任何想法 这是我的数据库表和
  • 你能快速告诉我这个伪代码是否有意义吗?

    我相信我的代码现在是万无一失的 我现在将写出伪代码 但我确实有一个问题 为什么 DRJava 要求我返回 if 语句之外的内容 正如你所看到的 我为 ex 写了 return 1 只是因为它问了 但是它永远不会返回该值 谁可以给我解释一下这

随机推荐

  • 使用读取繁重的 Slave 管理热备中 Postgres 复制的冲突和滞后

    要求 Avoid terminating connection due to conflict with recovery错误也可以接受replication lag Google Cloud PostgreSQL 9 6 复制已打开 使用
  • 如何在 Objective C 中创建单例类

    如何在 Objective C 中创建单例类 好吧 appDev 您可能会在网络上找到很多不同的技术来做到这一点 然而 对于iOS应用程序开发 我认为最方便的方法是执行以下操作 编写获取单例对象的方法 建议 使用dispatch once线
  • 自定义 UserManager 始终返回 null

    我正在尝试创建自己的UserManager从原始版本延伸 当我通过电子邮件进行搜索时 找不到该用户 但是如果我从上下文中进行搜索 如果我找到用户 请参阅Get方法 为了验证它是否确实得到了很好的实现 我覆盖了FindByEmailAsync
  • UIImagePicker 的内存问题

    我正在构建一个应用程序 它有几个不同的部分 所有这些部分都非常注重图像 它与我客户的网站相关 它们是 高设计 类型的服装 该应用程序的一部分是从相机或库上传的图像 以及显示缩略图网格的表格视图 相当可靠的是 当我处理 UIImagePick
  • 在 HTML 画布上设置文本格式 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我正在使用 HTML Canvas 和 vanilla javascript 制作游戏 我是 javascript 新手 所以这可能比我想象的要容易 我有两个代表卡片的对象数组
  • 处理开关盒

    我怎样才能用 switch 语句做这样的事情 String prototype startsWith function str return this indexOf str 0 switch myVar case myVar starts
  • 既然 appsettings.json 就足够了,那么 Hosting.json 有什么意义呢?

    在 NET Core 2 Web API 应用程序中 我可以覆盖配置urls using appsettings json 但在官方文档他们引入了额外的文件 hosting json 为什么 增加复杂性有什么意义 下面的代码完全可以使用ap
  • Python:无法使用 odeint 和 Signum 函数求解微分方程

    我正在尝试解决这个问题 U 在哪里 here s c e t e dot t and e t theta t thetad t and e dot t theta dot t thetad dot t 其中thetad thetadesir
  • 插入 MySQL 表 PHP

    我在制作一个简单的表单来将数据插入 MySQL 表时遇到了一些麻烦 我不断收到此 SQL 错误 错误 您的 SQL 语法有错误 请检查手册 与您的 MySQL 服务器版本相对应 以便使用正确的语法 第 1 行 stock ItemNumbe
  • 传单 - 我似乎无法让基本示例发挥作用

    我一直在尝试让 Leaflet 一个网络地图 API 工作几个小时 起初我犯了一个错误 试图做太多事情 现在我只是试图让基本的例子发挥作用 这是我的代码 HTML 和 Javascript
  • PHP 自动缩小。有没有?

    我使用 PHP Minify 它非常棒 但我的问题是 是否有任何 PHP 插件或其他东西可以自动检测 javascript css 代码并自动缩小它 谢谢 JavaScript 缩小器 看一看here require once jsmin
  • Web 应用程序 [ROOT] 似乎已启动名为 [pollingConfigurationSource] 的线程,但未能停止它。内存泄漏

    您好 我在运行项目时遇到内存泄漏错误 我在用spring boot quards scheduler liquibase postgreSQL 9 6 这些是我们正在使用的技术 Error 12018 10 15 11 43 19 005
  • 多对多关系

    我在 Parse com 上有两个课程 图像和数据 在数据类中 我保存了 3 个字段 姓名 手机号码和职业 在图像类中 我正在保存图像 我必须在这两个类之间创建关系 以便我可以使用相应的手机号码获取图像 一个手机号码可以保存多张图片 表数据
  • 将凭据/令牌保存在 cookie 中?

    我已经成功完成身份验证 我知道向客户端返回令牌 JWT 该令牌有一个到期日期 时间 因此我正在考虑将令牌保存在 cookie 中 以便对未来的登录进行身份验证 但这可能行不通 然后我考虑将用户名和密码保存在 cookie 中 尽管我知道不建
  • Python问号的正则表达式[重复]

    这个问题在这里已经有答案了 正在处理一个数据集 其中包含下一个审核日期的列 此列有缺失字段 以问号 表示 我想捕捉这个 使用正则表达式 然后将没有审核日期的所有行与其余数据分开 问题 明确匹配问号的表达式是什么 问号前的反斜杠表示 字面匹配
  • SQL 错误:ORA-12712:新字符集必须是旧字符集的超集

    我想将oracle数据库的字符集从 WE8MSWIN1252 更改为 AL32UTF8 我尝试从链接 http download oracle com docs cd B10501 01 server 920 a96529 ch10 htm
  • 如何在循环中运行固定数量的进程?

    我有一个这样的脚本 bin bash for i 1 to 200000 do create input file run java done 我需要同时运行多个 8 或 16 个进程 java 但我不知道如何运行 我知道wait可以提供帮
  • 添加自定义触发器时如何保留 mahapps Metro 样式?

    我有一个采用默认 Metro 风格的按钮 但是 当我向按钮添加触发器时 样式被覆盖 添加您自己的样式和触发器时如何保留原始的 mahapps Metro 样式
  • 将 json 扁平化为 csv 格式

    我正在尝试根据用户选择的字段将 json 值转换为平面 csv 我的 json 看起来像 var data index test type news source partnerName propertyFile 9 relatedSour
  • 为什么 Java 中的 volatile 不更新变量的值?

    我读过Java中的 易失性 允许不同的线程访问同一字段并查看其他线程对该字段所做的更改 如果是这种情况 我预测当第一个和第二个线程完全运行时 d 的值将增加到 4 但相反 每个线程都会将 d 增加到值 2 public class Vola