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

Spa*_*ker 8 java memory-model

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

注意:在当前Java内存模型下,以下代码可能不严格正确.

任何人都可以解释一下原因吗?

Iev*_*ash 5

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

也就是说,代码应该正常工作,但只允许多个线程同时过度重新计算缓存值.