有效的重新排序 - 根据新的 JMM

2023-12-31

我只是想知道以下重新排序在新的 JMM 模型下是否有效

Original Code: 
     instanceVar1 = value ;//  normal read operation, no volatile
     synchronized(this) {
       instanceVar2 = value2; //normal read operation, no volatile   
     }
     instanceVar3 = value3;  //normal read operation, no volatile

上面的代码可以重新排序为以下执行。

Case 1:

     synchronized(this) {
       instanceVar2 = value2; //normal read operation, no volatile   
       instanceVar1 = value ;//  normal read operation, no volatile
     }
     instanceVar3 = value3;  //normal read operation, no volatile

另一个案例:

Case 2:

  synchronized(this) {
       instanceVar3 = value3;  //normal read operation, no volatile
       instanceVar2 = value2; //normal read operation, no volatile   
       instanceVar1 = value ;//  normal read operation, no volatile
     }

另一个案例:

Case 3: 

    instanceVar3 = value3;  //normal read operation, no volatile
    synchronized(this) {
       instanceVar2 = value2; //normal read operation, no volatile   
       instanceVar1 = value ;//  normal read operation, no volatile
     }

另一个案例:

Case 4: 

    instanceVar3 = value3;  //normal read operation, no volatile
    synchronized(this) {
       instanceVar2 = value2; //normal read operation, no volatile   
     }
    instanceVar1 = value ;//  normal read operation, no volatile

上述4种情况是否都是新JMM模型下对原始代码的有效重新排序? 我根据我的理解对以上所有内容进行了重新排序http://gee.cs.oswego.edu/dl/jmm/cookbook.html http://gee.cs.oswego.edu/dl/jmm/cookbook.html


考虑如何通过监视器进入和退出来重新排序正常加载/存储:

情况 1 使用监视器输入重新排序正常加载/存储,这是有效的重新排序。

情况 2 通过监视器进入和监视器退出重新排序正常加载/存储,然后进行正常加载/存储,这是有效的重新排序。

看一个类似的例子:Roach 汽车旅馆和 Java 内存模型 http://jeremymanson.blogspot.co.uk/2007/05/roach-motels-and-java-memory-model.html。这表明访问可以移入同步块,但不能再次退出。

情况 3 和 4 对监视器输入重新排序,然后进行无效的正常加载/存储。

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

有效的重新排序 - 根据新的 JMM 的相关文章

随机推荐

  • 使用 VBScript 自动化应用程序

    我是 VB 脚本编写新手 我希望 VB 脚本根据应用程序的事件进行操作 例如 VBScript 应该等到应用程序中出现弹出消息 VBScript 和 Windows 脚本宿主仅支持原始 GUI 自动化 例如激活窗口 AppActivate
  • 如何存储每个类别对象的总提款金额?

    我有一个Category类 并且该类的每个实例都有一个分类帐属性 该分类帐属性实际上是一个字典列表 其中包含以下形式的取款和存款金额以及描述 amount amount description description 现在 我想定义一个函数
  • 在 Blend 2015 中使用 3D OBJ 文件

    我刚刚开始学习 WPF 3D 并按照教程进行操作 我创建了一个 3D 模型并将其导出为 OBJ 文件 创建一个新的 WPF 项目并添加此 OBJ 文件 我如何在里面使用它Window or Viewport3D 我在 Microsoft 找
  • 便携式图书馆的语言选择

    我想编写一个库 它将与在 Windows Linux 和 OS X 等现代操作系统上运行的其他程序动态链接 即 它将部署为 dll or so模块 在这种情况下最合适的语言是什么 我应该坚持使用纯 C 吗 或者C 也可以吗 您可以使用 C
  • std::lower_bound 和 std::set::lower_bound 之间的差异

    C 草案谈到了 std lower bound 25 4 3 1 lower bound lower bound template
  • 可以在沙箱中运行的 Mini-OSGi(如 AppEngine 或 WebStart)?

    我真的很喜欢 OSGi 实现的模块化捆绑包的概念 我还喜欢 托管部署 服务 例如 Google AppEngine 用于 Web 应用程序 或 Java WebStart 用于客户端软件 这两个想法似乎在概念上很好地互补 然而 OSGi 标
  • 对 Primefaces 中的树节点进行排序

    我正在使用 JSF 2 1 和 Primefaces 3 3 我正在使用 primefaces 树组件从数据库中创建树 我想按字母顺序对各级树节点进行排序 请帮我解决这个问题 我们在排序时遇到了问题Comparator并发现 有一个方便的P
  • 反序列化 XML 时忽略指定的编码

    我正在尝试通过套接字读取从外部接口接收到的一些 XML 问题是 XML 标头中指定的编码错误 显示为 iso 8859 1 但实际上是 utf 16BE 据记录编码是utf 16BE 但显然他们忘记设置正确的编码 为了在反序列化时忽略编码
  • Node.js HTTP 客户端中的自动 UTF-8 编码

    我尝试使用 Node js 从远程主机加载 XML 内容 问题是像 这样的德语 元音变音 被破坏了 就像在浏览器中一样 这通常是一个简单的编码问题 但由于远程主机上的 XML 内容是用 iso 8859 2 编码的 所以我没有成功让这些字母
  • 消息:插入动态输入字段数据时未初始化的字符串偏移量:0

    我正在使用 CodeIgniter 我得到了动态选择框 从第二个选择框中 用户可以选择状态并根据状态输入字段进行显示 检查下面的屏幕截图 如果用户单击Add More然后将显示下面的选择框 现在从第二个选择框中 我选择Status one因
  • 如何使用 Symfony 表达式语言在 @Security 注释中使用类常量?

    我正在使用 Symfony 3 并且创建了一个自定义 Voter 类 我想使用访问它SensioFrameworkExtraBundle https symfony com doc current bundles SensioFramewo
  • 对重载new和delete施加限制

    是否可以对重载运算符 new 和 delete 施加一些限制 我的重载 new 在另一个文件中链接到我的测试程序 场景是 if condition is satisfied call overloaded new else call the
  • 如何在android中卸载应用程序时清除数据库

    我使用数据库来存储消息 如果我卸载我的应用程序并再次重新安装相同的应用程序 数据库保持不变 但我想清除我的数据库 如何解决这个问题 要监听卸载事件 您必须实现收到的广播 例如
  • 在条件表达式中声明变量(三元运算符)

    是否可以在条件表达式中声明变量 例如 下面的代码返回语法错误 因为我已经在条件表达式中声明了变量 x var a document getElementById userData var d a value function d lengt
  • 在 Vue.js 中构建期间传递要由 .env.[mode] 文件使用的参数(命令行)

    Goal 传递一个在构建时使用的参数 以便能够在我的 env Production 文件中使用它 或者如果不可能的话 可以让我将它用作环境变量 env 生产文件 VUE APP CLIENT ID 00 should be using wh
  • 计算一行中 NULL 属性的数量

    我想在表中添加一个新列来记录每个元组 行 值为空的属性的数量 如何使用 SQL 获取号码 例如 如果一个元组是这样的 Name Age Sex Blice 100 null 我想更新元组如下 Name Age Sex nNULL Blice
  • EclipseLink 审核/历史记录/跟踪更改

    我尝试实现一种跟踪数据更改并为我的应用程序创建历史日志的方法 因为我正在使用 EclipseLink 所以应该很容易并且可以像它们一样获得更改写在 EclipseLink FAQ 上 http wiki eclipse org Eclips
  • 数组作为类的私有成员

    我正在尝试创建一个具有私有成员 数组 的类 我不知道数组的大小 直到将值传递到构造函数中才知道 定义类构造函数以及 h 文件中的定义以允许数组大小可变的最佳方法是什么 如果你想要一个 真正的 C 风格数组 你必须向你的类添加一个指针私有成员
  • 为什么此代码在 Xcode 模拟器上有效,但在设备上不起作用?

    我真的希望有人向我解释一下 我正在编写一个使用其设备 MAC 地址的应用程序 并且此代码在模拟器上完美运行 但在设备上不起作用 我从问题中得到了这个代码在 Objective C 中获取路由器 mac 无需系统调用 ARP https st
  • 有效的重新排序 - 根据新的 JMM

    我只是想知道以下重新排序在新的 JMM 模型下是否有效 Original Code instanceVar1 value normal read operation no volatile synchronized this instanc