2

在我阅读JLS 第 12.4.2 节之后。

2.如果C的Class对象指示其他线程正在对C进行初始化,则释放LC并阻塞当前线程,直到通知正在进行的初始化已经完成,此时重复此步骤。

当前线程真的需要释放被其他线程获取的 LC 吗?这个动作安全吗?一个应用程序中会发生多少次类或接口的初始化?谢谢。

4

1 回答 1

4

JVM 的约定是在允许任何应用程序线程使用该类之前,该类已完成加载。“加载完成”意味着所有的静态初始化器都已完成(即所有的静态块都已执行并且静态字段按照它们被编码的顺序被初始化)

类在第一次使用时被加载,因此(隐式)中发生的任何线程都会调用 ClassLoader 来加载类,并在 ClassLoader 完成加载类时阻塞(如上所述)。在加载类时碰巧使用该类的任何其他线程也将阻塞等待类完成加载。

每次 JVM 启动时都会加载一次类。


学徒注意:是的,可以使用 ClassLoader kung fu 重新加载一个类,但这种解释没有误导性。

于 2012-07-17T05:11:44.623 回答