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

时间:2018-04-25 11:30:12

标签: java static classloader deadlock

我有一个类ItemType,其中包含引用子类实例的最终静态字段:

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

static class BuiltInAtomicItemType extends ItemType {

    public BuiltInAtomicItemType(X x) {
        this.x = x;
    }

如果一个线程首先加载超类而另一个类首先加载子类,则会导致类加载死锁的可能性。

现在的问题是这是一个公共API,我无法轻易改变它。我想删除类加载死锁的可能性,但我不想强制更改引用ItemType.DURATION或其他40多个类似字段的应用程序。

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

1 个答案:

答案 0 :(得分:0)

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