我碰到下面的註釋在JDK進來java.lang.Class.newInstance0()
1.7更新7:爲什麼java.lang.Class.newInstance0()在java內存模型下嚴格不正確?
注意:下面的代碼可能不是當前的Java內存模型下,完全正確。
任何人都可以請解釋爲什麼嗎?
我碰到下面的註釋在JDK進來java.lang.Class.newInstance0()
1.7更新7:爲什麼java.lang.Class.newInstance0()在java內存模型下嚴格不正確?
注意:下面的代碼可能不是當前的Java內存模型下,完全正確。
任何人都可以請解釋爲什麼嗎?
我能看到的代碼中唯一的問題是,「cachedConstructor」字段是volatile的,它保證了線程之間的值可見性效果,這個特殊的代碼塊有個怪癖,不同的線程可能會在值之前看到cachedConstructor爲null將由一個線程分配,即初始化序列不是原子的。這隻會導致cachedConstructor可能被同時分配幾次,但如果沒有人特別依賴於它將是相同的構造函數實例,則不會破壞代碼。如果cachedConstructor初始化塊將被同步,則它將是原子的,即不管競爭條件如何,只分配一次cachedConstructor。
也就是說,代碼應該正常工作,但只允許多個線程同時對緩存值進行過度重新計算。
那麼我想這個評論的作者應該更清楚一點。感謝澄清。 – SpaceTrucker
當前的Java內存模型
的問題是 「如何對現有的」。
那段代碼可能很古老,1.4或更早,並且從此沒有人觸及它。
作者可能已經意識到正在開發新的內存模型。
請引用相關的「下面的代碼」? – Vlad
我找到了筆記(感謝谷歌)http://cr.openjdk.java.net/~Jrose/7030453/webrev.00/raw_files/new/src/share/classes/java/lang/Class.java – Augusto
種DCL? http://www.javaworld.com/jw-02-2001/jw-0209-double.html – Flot2011