2.If the Class object for C indicates that initialization is in progress for C by some other thread, then release LC and block the current thread until informed that the in-progress initialization has completed, at which time repeat this step.
当前线程是否真的需要释放其他线程获取的LC?这个 Action 安全吗?一个应用程序中会发生多少次类或接口(interface)的初始化?谢谢。
最佳答案
JVM 的约定是,在允许任何应用程序线程使用该类之前,该类已完成加载。 “加载完成”意味着所有静态初始化程序都已完成(即所有静态 block 已执行并且静态字段按照编码顺序初始化)
类在第一次使用时加载,因此无论发生什么线程(隐式)都会调用 ClassLoader 来加载类,并且在 ClassLoader 完成加载类时会阻塞(如上所述)。 在加载类时碰巧使用该类的任何其他线程也将阻塞等待类完成加载。
每次 JVM 启动时都会加载一次类。
学究们请注意:是的,可以使用 ClassLoader 功夫来重新加载类,但这种解释不会产生误导。
关于java - 类和接口(interface)的初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11516219/