为什么java.lang.Class.newInstance0()在java内存模型下没有严格正确?

时间:2012-11-01 12:40:29

标签: java memory-model

我在JDK 1.7 Update 7中的java.lang.Class.newInstance0()中看到了以下注释:

  

注意:在当前的Java内存模型下,以下代码可能不完全正确。

有人可以解释一下原因吗?

2 个答案:

答案 0 :(得分:5)

我可以看到这个代码中唯一的问题是“cachedConstructor”字段是volatile,而它保证了线程之间的值可见性效果,这个特定的代码块有一个怪癖,不同的线程可以在值之前看到cachedConstructor为null由一个线程分配,即初始化序列不是原子的。这只能导致cachedConstructor可以同时分配几次,但如果没有人特别依赖它将是同一个Constructor实例,则不会破坏代码。如果cachedConstructor初始化块将被同步,那么它将是原子的,即cachedConstructor只被分配一次而不管竞争条件。

尽管如此,代码应该可以正常工作,但只允许多个线程同时过度重新计算缓存值。

答案 1 :(得分:1)

  

当前的Java内存模型

问题是“当前有多”。

这段代码可能非常古老,1.4或更早,从那时起就没人接触过它。

作者可能已经意识到正在开发一种新的内存模型。