我有这个课程:
public class User {
public static final NonRegisteredUser NON_REG_USER = new NonRegisteredUser();
//...
public static class NonRegisteredUser extends User {
//...
}
}
代码检查员正在检测此警告:
从超类User引用子类NonRegisteredUser 初始化程序可能导致类加载死锁
究竟是什么意思?
答案 0 :(得分:7)
只有当你有2个线程并且一个开始加载User
并且一个开始加载NonRegisteredUser
时,才会发生死锁。有适当的同步将导致死锁,但它需要单独的线程。如果加载发生在一个线程中,则没有死锁,因为线程拥有两个锁。
因此消息中的可能。然而,死锁通常往往需要一个特定的环境,因此没有什么奇怪的。
答案 1 :(得分:-1)
类加载器开始加载User
。
静态成员首先是init in order or appearance。所以类加载器会看到NonRegisteredUser
类,并尝试加载User
类进行初始化。
接下来,类加载器开始加载User
。
静态成员首先是init in order or appearance。所以类加载器会看到NonRegisteredUser
类,并尝试加载User
类进行初始化。
接下来,类加载器开始加载User
。
静态成员首先是init in order or appearance。所以类加载器看到NonRegisteredUser
类,并尝试加载User
类进行初始化......