这里的“类加载死锁”是什么意思?

2022-09-04 21:04:22

我有这个类:

public class User {

    public static final NonRegisteredUser NON_REG_USER = new NonRegisteredUser();

    //...

    public static class NonRegisteredUser extends User {
        //...
    }

}

代码检查器检测到此警告:

从超类用户初始值设定项引用子类非注册用户可能会导致类装入死锁

这到底是什么意思?


答案 1

只有当您有 2 个线程并且一个开始加载,一个开始加载时,才会发生死锁。存在会导致死锁的同步,但随后需要单独的线程。如果加载发生在单个线程中,则不会出现死锁,因为线程拥有两个锁。UserNonRegisteredUser

因此,消息中可能存在。然而,死锁通常往往需要特定的环境,所以这没什么奇怪的。


答案 2

类装入器开始装入 。User

静态成员按出现顺序首先初始化。因此,类装入器看到该类,并尝试装入该类以进行初始化。NonRegisteredUserUser

接下来,类装入器开始装入 。User

静态成员按出现顺序首先初始化。因此,类装入器看到该类,并尝试装入该类以进行初始化。NonRegisteredUserUser

接下来,类装入器开始装入 。User

静态成员按出现顺序首先初始化。因此,类装入器看到该类,并尝试装入该类以进行初始化...NonRegisteredUserUser


推荐