我试图了解对JDK所做的更改:
http://hg.openjdk.java.net/jdk8/jdk8/jdk/rev/223be1d3494f
在此更改之前,使用双重检查锁定来确保线程安全,从而导致问题.
他们为什么要使用另一个子类?为什么他们不只是使用static final Random randomNumberGenerator = new Random();的StrictMath?
或者,更一般的是,为什么会这样:
标准技术是拥有一个嵌套的子类,并根据需要初始化最终字段(懒惰)
这是有效Java第48项中描述的初始化按需持有者习语.
请参阅:https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom
另请参阅:正确实现按需初始化持有者习惯用法