java內存模型規定編寫一個int
是原子的:也就是說,如果您在一個線程中爲其寫入一個值(由4個字節組成)並在另一個線程中讀取它,您將得到所有字節或無,但從來沒有2個新的字節和2箇舊的字節等。在64位虛擬機上編寫參考原子
這不保證long
。在此,將0x1122334455667788
寫入一個變量,該變量保存0
之前可能會導致另一個線程讀取0x112233440000000
或0x0000000055667788
。
現在規範沒有強制對象引用是int或long-sized。出於類型安全原因,我懷疑它們是以原子方式寫入的,但在64位VM上,這些引用可能是64位值(僅限於內存地址)。
現在,這裏是我的問題:
- 是否有覆蓋這個(我還沒有發現)任何存儲器模型規範?
- 是否長篇可疑是64位VM上的原子?
- 虛擬機是否被迫將引用映射到32位?
問候, 斯特芬
@Steffen萬歲:吹毛求疵,但請注意,並非所有的引用都是內部64位甚至64位虛擬機(由於垃圾64所定義產生數量驚人)。現代VM正在使用名爲*「CompressedOops」*的指針壓縮/引用壓縮:http://wikis.sun.com/display/HotSpotInternals/CompressedOops因此,我並不反對它們*可能是64位值,但它們通常不是(並不是說這與德克公佈的答案有很大關係)。 – SyntaxT3rr0r 2010-04-05 02:21:16