Java静态初始化器引用子类:避免类加载死锁

Mic*_*Kay 5 java static deadlock classloader

我有一个ItemType带有最终静态字段的类,它引用子类的实例:

public static final ItemType DURATION = new BuiltInAtomicItemType(x);

static class BuiltInAtomicItemType extends ItemType {

    public BuiltInAtomicItemType(X x) {
        this.x = x;
    }
Run Code Online (Sandbox Code Playgroud)

如果一个线程先加载父类,而其他类首先加载子这引起了一个类加载死锁的可能性.

现在问题是这是一个公共API,我不能轻易改变它.我想删除一个类加载死锁的可能性,但我不希望迫使引用应用程序改变ItemType.DURATION或其他40多个类似的领域.

有没有办法在保留公共API的同时避免潜在的死锁?

Mic*_*Kay 4

状态报告:似乎没有人知道这一问题的解决方案。在复杂的应用程序中设计类结构以避免类加载和初始化期间发生死锁的所有可能性似乎非常困难。在一般情况下,修改现有应用程序以消除这种可能性而不对公共 API 进行不兼容的更改似乎是不可能的。