8

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

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

有人可以解释为什么吗?

4

2 回答 2

5

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

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

于 2012-11-01T12:58:15.553 回答
1

当前的 Java 内存模型

问题是“电流如何”。

那段代码可能很古老,1.4 或更早版本,从那以后就没有人碰过它。

作者可能知道正在研究一种新的内存模型。

于 2012-11-01T17:36:01.910 回答