2015-03-02 58 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