2012-11-01 65 views
8

我碰到下面的註釋在JDK進來java.lang.Class.newInstance0() 1.7更新7:爲什麼java.lang.Class.newInstance0()在java內存模型下嚴格不正確?

注意:下面的代碼可能不是當前的Java內存模型下,完全正確。

任何人都可以請解釋爲什麼嗎?

+0

請引用相關的「下面的代碼」? – Vlad

+0

我找到了筆記(感謝谷歌)http://cr.openjdk.java.net/~Jrose/7030453/webrev.00/raw_files/new/src/share/classes/java/lang/Class.java – Augusto

+0

種DCL? http://www.javaworld.com/jw-02-2001/jw-0209-double.html – Flot2011

回答

5

我能看到的代碼中唯一的問題是,「cachedConstructor」字段是volatile的,它保證了線程之間的值可見性效果,這個特殊的代碼塊有個怪癖,不同的線程可能會在值之前看到cachedConstructor爲null將由一個線程分配,即初始化序列不是原子的。這隻會導致cachedConstructor可能被同時分配幾次,但如果沒有人特別依賴於它將是相同的構造函數實例,則不會破壞代碼。如果cachedConstructor初始化塊將被同步,則它將是原子的,即不管競爭條件如何,只分配一次cachedConstructor。

也就是說,代碼應該正常工作,但只允許多個線程同時對緩存值進行過度重新計算。

+0

那麼我想這個評論的作者應該更清楚一點。感謝澄清。 – SpaceTrucker

1

當前的Java內存模型

的問題是 「如何對現有的」。

那段代碼可能很古老,1.4或更早,並且從此沒有人觸及它。

作者可能已經意識到正在開發新的內存模型。

相關問題