Java 和 C# 中易失性语义背后的原因是什么

2023-12-28

C# 和 Java 都定义了这一点
* 易失性读取具有获取语义
* 易失性写入具有释放语义

我的问题是:

  1. 这是定义 volatile 的唯一正确方法吗?
  2. If not, will things be awfully different if the semantics were reversed, that is
    • 易失性读取具有释放语义
    • 易失性写入具有获取语义

背后的原因volatile语义植根于Java内存模型 http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html,其指定为actions:

  • 读取和写入变量
  • 监视器的锁定和解锁
  • 启动和连接线程

Java内存模型定义了一个部分排序 http://en.wikipedia.org/wiki/Partially_ordered_set called 发生在之前Java 程序中可能发生的操作。通常不能保证线程可以看到彼此操作的结果。

假设您有两个操作A and B。为了保证执行动作B的线程可以看到动作A的结果,必须有一个发生在之前A 和 B 之间的关系。如果没有,JVM 可以自由地reorder他们随心所欲。

未正确同步的程序可能会出现数据争用。当变量由 > 1 个线程读取并由 >= 1 个线程写入时,就会发生数据争用,但读取和写入操作未通过happens-before排序进行排序。

因此,正确同步的程序没有数据竞争,并且程序中的所有操作都按固定顺序发生。

所以动作一般只是部分地已订购,但还有一个total订单之间:

  • 锁的获取和释放
  • 读取和写入volatile变量

这些动作都是完全有序的。

这使得描述变得合理发生在之前就“后续”锁定获取和易失性变量的读取而言。

关于您的问题:

  1. 通过事前发生的关系,你有一个替代的定义volatile
  2. 颠倒顺序对于上面的定义来说没有意义,特别是因为涉及到总顺序。

这说明了当两个线程使用公共线程同步时的发生前关系lock。线程 A 内的所有操作都是按程序顺序规则排序,线程 B 内的操作也是如此。因为 A 释放了锁 M 和 B随后获取M,因此释放锁之前A中的所有动作都是之前订购过获取锁后B中的动作。当两个线程同步时不同的锁,我们不能说任何关于它们之间的操作顺序的事情,两个线程中的操作之间没有发生之前的关系。

Source: Java 并发实践 http://jcip.net/

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

Java 和 C# 中易失性语义背后的原因是什么 的相关文章

随机推荐

  • Swift Playgrounds 中的链接页面 [Xcode]

    我是 Swift Playgrounds 的新手 在 Xcode 中制作 Swift Playground 时遇到了一些问题 这是我的 Playground 主页面 import UIKit import PlaygroundSupport
  • Python lambda函数根据字典对列表进行排序

    下面的示例代码检索所有正在运行的进程并打印它们 他们是按照第三个例子写的here http www programcreek com python example 53869 psutil process iter最后一张来自here ht
  • Visual Studio 2017 中适用于 JavaScript 和 TypeScript 文件的 Visual Studio Code 颜色主题

    正如主题所示 我想在 Visual Studio 2017 中为 JavaScript 和 TypeScript 文件导入 设置 Visual Studio Code 颜色主题 因此 我想为其设置颜色主题的文件是 js jsx ts and
  • jQuery Colorbox,iframe 内容在 iPad 中不滚动

    在 iPad 上查看时 Colorbox iframe 内容不会滚动 请阅读以下内容 https github com jackmoore colorbox issues 41 issuecomment 5244379 https gith
  • 为什么当 GMSMarker 与 GMSOverlay 重叠时我需要点击两次 GMSMarker 才能显示其信息窗口?

    我有一个GMS覆盖在 GMSMapView 中 所以我用以下方法监听对它的点击 func mapView mapView GMSMapView didTap overlay GMSOverlay Overlay was tapped 然后我
  • WAMP 上的 Mysqli,错误 - 连接尝试失败

    添加信息 我尝试了全新安装的 codeigniter 只需添加 this gt load gt database 默认控制器会触发相同的错误 我检查了 phpinfo 并且 mysqli 已安装 我用下面的代码检查了它并且它正在工作 当我打
  • 复制文件,保留权限和所有者

    Shutil 的文档告诉我 即使是更高级别的文件复制函数 shutil copy shutil copy2 也无法复制所有文件元数据 在 POSIX 平台上 这意味着文件所有者和组以及 ACL 都会丢失 如果我需要在python中复制文件
  • 检查视图是否自午夜以来已加载

    我有一个 ViewController 它对数组执行随机洗牌并将文本吐出到标签 在viewDidLoad方法 问题是 每当我导航到同一个 ViewController 时 它都会再次执行随机播放 而我每天只需要它随机播放一次 因此 我需要检
  • 从 iOS 应用内购买收据中检索订单 ID/文档编号

    目前 我们的系统的工作方式是 当用户购买应用内订阅时 购买的收据数据会发送到服务器 验证后我们将相应地更改用户的权利 有时 由于各种原因 我们可能会遇到这样的问题 用户可能没有获得应有的权利 在这种情况下 他们会通过电子邮件向我们发送从 A
  • 在 GSON 中使用泛型

    我正在使用 GSON 将 JSON 解码为 T 类型的对象 例如 public T decode String json Gson gson new Gson return gson fromJson json new TypeToken
  • 禁用 XAML 预览

    在 Visual Studio 2008 中 当我从项目中打开 XAML 文件时 它会显示水平分割 预览位于顶部 XAML 位于底部 大多数时候 我们的 XAML 不会在预览中呈现 因此我只需等待它尝试呈现 然后关闭预览 有没有办法让它默认
  • 如何安装我自己的扩展? VS代码

    我使用 Yeoman Generator 制作了自己的扩展包 但我不知道如何将其安装在我的 vscode 上 也许如果我将扩展包导出到市场 这是可能的 但我不想这样做 You can 将扩展打包到 vsix 文件中 https code v
  • bash——在运行之间存储变量的更好方法?

    我制作了一个 bash 脚本 我使用 crontab 每小时运行一次 并且我需要存储一个变量 以便下次运行它时可以访问它 该脚本每次运行时都会更改变量 因此我无法对其进行硬编码 现在我将其写入 txt 文件 然后读回 还有比这更好的方法吗
  • 在数据库的未知表中查找特定列?

    我试图在包含 125 个表的数据库中找到未知的特定列 我正在寻找一个通配符 例如 watcher 这可能吗 SELECT TABLE NAME COLUMN NAME DATA TYPE IS NULLABLE COLUMN DEFAULT
  • Java/HTML 编码问题(破折号变成 -)

    情况 我正在尝试修复一些使用 Java 后端通过 Velocity Mail Manager 发送自动电子邮件的代码 问题 主题在Java代码中设置如下String subject Hello what s next 然后将其设置为消息对象
  • 重复将数据从 Windows 服务传输到控制台应用程序

    这是我的场景 我有一个 Windows 服务 每 20 分钟运行一次任务 任务是 从远程网站托管的 API 请求更新 响应是 JSON 对象列表 当服务收到该列表时 它会执行一组操作 然后附加更多 JSON 对象 最后服务必须将该列表推送到
  • x86 上两个 128 位整数的高效乘法/除法(无 64 位)

    编译器 明威 海湾合作委员会 Issues 不允许使用 GPL LGPL 代码 GMP 或任何 bignum 库对于这个问题来说都太过分了 因为我已经实现了该类 我已经构建了自己的128 bit固定大小的大整数类 旨在用于游戏引擎 但可以推
  • SCRIPT70:添加选项以从最近关闭的 iframe 中选择元素时权限被拒绝

    我们在从 iframe 向选择元素添加选项时遇到问题 该代码在 Chrome Firefox 和 Opera 中运行良好 但在 IE11 中 当尝试从父窗口访问最近创建的选项时 我们会收到 SCRIPT70 权限被拒绝 我们需要的是将选项添
  • 如何使 Xamarin.Forms.Editor 可滚动/自动调整大小?

    我有一个可滚动布局 里面有一个编辑器 我想使其可滚动或自动调整大小以适应内容 我找不到怎么做 我尝试了自定义渲染器 但找不到如何将 InputMethods 设置为控件 有任何想法吗 在这篇文章的帮助下 https forums xamar
  • Java 和 C# 中易失性语义背后的原因是什么

    C 和 Java 都定义了这一点 易失性读取具有获取语义 易失性写入具有释放语义 我的问题是 这是定义 volatile 的唯一正确方法吗 If not will things be awfully different if the sem