类初始化期间可能会发生死锁。
例如有如下代码
class A {
static final B b = new B();
}
class B extends A {
}
这是一个潜在的问题区域。是否有针对此类代码的解决方案来避免这种情况?
网络协议:
我会写更多。
有一个不可变列表的实现。
abstract class List<T>{
private static final List<Object> EMPTY = new Empty<>();
private remove(int index){
if(index<0)
throw new IllegalArgumentException("index must be more zero");
return innerRemove(index);
}
protected abstract List<T> innerRemove(int index);
public static List<T> create(){
return EMPTY;
}
}
class Empty<T> extends List<T>{
protected List<T> innerRemove(int index){return this}
}
可以通过相应的可见性更改将字段传输
EMPTY
到类Empty
(就像在 Guava中所做的那样)。然后类
Empty
会在调用时初始化List.create()
(此时类List
已经加载),或者自己初始化(这可能导致加载List
,但由于List
不再需要Empty
,因此排除了死锁)