【问题标题】:Java vs C# and volatile 64 bit types (long, double)Java vs C# 和 volatile 64 位类型(long、double)
【发布时间】:2015-03-02 15:01:36
【问题描述】:

Java 保证对声明为 long 和 doubles 的 volatile 进行原子读/写(即使在 32 位环境中),而 C# 则不保证(编译错误)。为什么C#不支持这个,Java是在字节码层面处理的?

【问题讨论】:

  • 你在说什么编译器错误?
  • 例如volatile 字段不能是“long”类型

标签: java c# 64-bit volatile


【解决方案1】:

为什么 C# 不支持这个?

如果您运行的是带有 64 位 CLR 版本的 64 位系统,long and double reads and writes are guaranteed to be atomic:

如果您在 64 位操作系统上以 64 位操作系统运行 C# 代码 然后 CLR 版本读取和写入 64 位双精度和长整数 整数也保证是原子的

这是根据CLI specification,§I.12.6.6 节:

符合标准的 CLI 应保证 对 正确对齐的内存位置不大于本机字大小 (原生 int 类型的大小)是原子的(参见 §I.12.6.2),当所有 对某个位置的写访问大小相同。 原子写入应 除了那些写入的位之外,不要更改任何位。除非显式布局控制 (参见第二部分(控制实例布局))用于更改 默认行为,数据元素不大于自然字长 (本机 int 的大小)应正确对齐。目的 引用应被视为存储在本地 字长。

【讨论】:

猜你喜欢
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多