java - 类和接口(interface)的初始化

标签 java

读完JLS section 12.4.2后.

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/

相关文章:

java - GridBagLayout 是否需要空单元格的占位符面板?

java - 在 View 子类中实现监听器是否存在问题?

java - 比较前后一个 TextView

java - Java 中是否有比 Xalan/Xerces 更快的 XML 解析器

java - 如何在 Spring Boot 应用程序中实例化日志

java - 使用 Java 和 Spring 在 Oracle 数据库中插入 UTC/GMT 日期

java - 我应该在基于 HornetQ 的应用程序中只使用一个 session 吗?

java - 如何在 logback 中滚动应用程序关闭时的日志文件?

java - 在 Java 文档中查看所有扩展当前查看类的类?

java - Spring MVC Web 应用程序 - 银行应用程序的权限机制