Java vs C#和易失性64位类型(长、双)

Java vs C#和易失性64位类型(长、双),java,c#,64-bit,volatile,Java,C#,64 Bit,Volatile,Java保证对volatile声明的long和double(即使在32位环境中)进行原子读/写,而C#不保证(编译错误)。为什么C#不支持这一点,Java在字节码级别处理这一点 为什么C#不支持这一点 如果您正在运行64位CLR版本的64位系统,则: 如果您在64位操作系统上以64位模式运行C#代码 然后,CLR版本读取和写入64位双精度和长精度 整数也保证是原子的 这是根据第§I.12.6.6节: 符合要求的CLI应保证对 正确对齐的内存位置不大于本机字大小 (本机int类型的大小)是原子的(

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

为什么C#不支持这一点

如果您正在运行64位CLR版本的64位系统,则:

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

这是根据第§I.12.6.6节:

符合要求的CLI应保证对 正确对齐的内存位置不大于本机字大小 (本机int类型的大小)是原子的(见§I.12.6.2),当所有 对某个位置的写入访问大小相同。原子写入应 除了写下的内容外,不要改变其他内容。除非有明确的布局控制 (参见分区II(控制实例布局))用于更改 默认行为,数据元素不大于自然字号 (本机int的大小)应正确对齐。对象 参考资料应被视为存储在本地文件中 字号


您所说的编译器错误是什么?例如,volatile字段不能是'long'类型是的,但是如果我们不能将其标记为volatile,则仍然存在可见性问题。即使使用32位体系结构,Java也能解决这两个问题。你说的可见性问题是什么意思?@Stig我知道volatile是什么。我不明白你所说的可见性是什么意思。好的,请阅读这里的可见性一词。