1.如果出于性能的考虑而需要对实例域使用延迟初始化,就使用双重检查模式(double-check idiom)。这种模式避免了在域被初始化后访问这个域时的锁定开销。注意到实例域使用了volatile修饰符。
使用局部变量result的目的是为了提升性能。
2.如果出于性能的考虑而需要对静态域使用延迟初始化,就使用Lazy Initialization Holder Class模式。
这种模式的魅力在于getField方法没有被同步,因此延迟初始化实际上并没有增加任何访问成本。
//Double-check idiom for lazy initialization of instance fields
private volatile FieldType field;
FieldType getField() {
FieldType result = field;
if(result == null) { // First check(no locking)
synchronized (this) {
result = field;
if(result == null) //Second check(with locking)
field = result = computeFieldVale();
}
}
return result;
}
使用局部变量result的目的是为了提升性能。
2.如果出于性能的考虑而需要对静态域使用延迟初始化,就使用Lazy Initialization Holder Class模式。
// Lazy Initialization holder class idiom for static fields
private static class FieldHolder {
static final FieldType field = computeFieldValue();
}
static FieldType getField() { return FieldHolder.field;}
这种模式的魅力在于getField方法没有被同步,因此延迟初始化实际上并没有增加任何访问成本。