【发布时间】:2015-03-02 15:01:36
【问题描述】:
Java 保证对声明为 long 和 doubles 的 volatile 进行原子读/写(即使在 32 位环境中),而 C# 则不保证(编译错误)。为什么C#不支持这个,Java是在字节码层面处理的?
【问题讨论】:
-
你在说什么编译器错误?
-
例如volatile 字段不能是“long”类型
Java 保证对声明为 long 和 doubles 的 volatile 进行原子读/写(即使在 32 位环境中),而 C# 则不保证(编译错误)。为什么C#不支持这个,Java是在字节码层面处理的?
【问题讨论】:
为什么 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 的大小)应正确对齐。目的 引用应被视为存储在本地 字长。
【讨论】: