public class DoubleClick {
// Double-check idiom for lazy initialization of instance fields
private volatile FieldType field;
private FieldType getField() {
FieldType result = field;
if (result == null) { // First check (no locking)
synchronized (this) {
if (field == null) { // Second check (with locking)
field = result = computeFieldValue();
}
}
}
return result;
}
private static FieldType computeFieldValue() {
return new FieldType();
}
}
class FieldType {
}
定义了一个局部变量result的作用是确保field只在已经被初始化的情况下读取一次,可以提升性能,在我的机器上,上述的方法比没有用局部变量的方法快了大概1.4倍。