Java 并发性-为什么对最终静态字段使用嵌套子类?

Java 并发性-为什么对最终静态字段使用嵌套子类?,java,concurrency,Java,Concurrency,我试图理解JDK的一个变化: 在此更改之前,双重检查锁定用于确保螺纹安全,这会导致问题 他们为什么还要使用另一个子类?为什么他们不简单地使用static final Random Random numbergenerator=new Random()在StrictMath中 或者,更一般地说,为什么会这样: 标准技术是使用一个带有final字段的嵌套子类 按需初始化(延迟) (from)如果在父级中使用静态final字段,则不会进行延迟初始化。 类的静态字段在首次使用并加载该类时初始化。 因此

我试图理解JDK的一个变化:

在此更改之前,双重检查锁定用于确保螺纹安全,这会导致问题

他们为什么还要使用另一个子类?为什么他们不简单地使用
static final Random Random numbergenerator=new Random()
StrictMath

或者,更一般地说,为什么会这样:

标准技术是使用一个带有final字段的嵌套子类 按需初始化(延迟)


(from)

如果在父级中使用静态final字段,则不会进行延迟初始化。 类的静态字段在首次使用并加载该类时初始化。 因此,如果父类中有一个静态final字段,那么一旦引用外部类,它就会被初始化

通过使用此习惯用法,您可以延迟加载,因为内部类的静态final字段仅在首次使用时初始化,因此需要初始化。

这是按需初始化持有者习惯用法,如有效Java第48项所述

见:


另请参见:

问题是,我不认为它为什么会这样做,具体来说,为什么它不在父级中使用静态final字段。“为什么他们不简单地使用静态final Random Random numbergenerator=new Random();”--可能是为了节省内存
Math.random()
很少使用。好吧,所以在StrictMath中不直接使用静态final字段的唯一原因是延迟初始化,并发性并不严格需要它?@Polygenme它以比使用双重检查锁定更低的成本/更简单的方式获得延迟初始化和线程安全。(DCL过去是不安全的;从Java5开始,它只是复杂且容易出错。)好的,谢谢,如果你把最后一条评论添加到答案中,那就太完美了;)知道这个成语的名字已经帮助我找到了更多的信息。