2015-03-02 26 views
0

Java保证对易失性声明的long和double(即使在32位环境中)进行原子读/写,而C#不会(编译错误)。为什么C#不支持这一点,并且Java在字节码级别上处理这个问题?Java与C#和volatile 64位类型(long,double)

+1

你在说什么编译器错误? – 2015-03-02 15:02:30

+0

例如易失性字段不能是“long”类型 – Stig 2015-03-02 18:59:07

回答

0

为什么C#不支持这个?

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

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

这是根据CLI specification,部分§I.12.6.6是原子:

一个符合CLI须保证读取和写入访问 正确对齐的内存位置并不比本地字大小 (原生类型为int的大小)是原子(见§I.12.6.2)时所有 写访问的位置都是相同的大小。原子写入 不会改写除写入的位以外的位。除非明确的布局控制 (请参阅分区II(控制实例布局))用于更改默认行为,否则不应超过自然字大小 (本地int的大小)的数据元素应正确对齐。对象 引用应被视为它们存储在原始文字大小 中。

+0

是的,但如果我们无法将其标记为易失性,我们仍然存在可见性问题。即使是32位体系结构,Java也解决了这两个问题。 – Stig 2015-03-02 15:18:16

+0

你的意思是*可视性问题*? – 2015-03-02 15:18:46

+0

https://msdn.microsoft.com/en-us/library/x13ttww7.aspx?f=255&MSPPError=-2147217396 – Stig 2015-03-02 15:24:16