Effective Java 之-----关于延迟初始化

Posted hunter_Cecil

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Effective Java 之-----关于延迟初始化相关的知识,希望对你有一定的参考价值。

1、大多数情况下,正常的初始化要优先于延迟初始化。

private final FieldType field = computeFieldValue();

2、如果利用延迟优化来破坏初始化的循环,就要使用同步访问方法,因为它是最简单、最清楚的替代方法。

private FieldType field;
synchronized FieldType getField(){
    if(field == null){
        field = computeFieldValue();
    }
    return field;
}

3、如果出于性能考虑需要对静态域使用延迟初始化,就使用lazy initialization holder class 模式,保证类要到被用到的时候才会被初始化。

private static class FieldHolder{
    static final FieldType field = computeFieldValue();
}
static FieldType getField(){
    return FieldHolder.field;
}

  当getField被第一次调用时,第一次读取FieldHolder.field,导致FieldHolder得到初始化。

4、如果出于性能考虑需要对实例域使用延迟初始化,就使用双重检查模式(double check idiom),这种模式避免了在域被初始化之后访问这个域时的开销。

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 = computeFieldValue();
            }
        }
    }
    return result;
}

  两次检查域值,第一次检查时没有锁定,看这个域是否被初始化了;第二次检查时锁定,只有当第二次检查时表明这个域没有被初始化,才会调用computeFieldValue方法对这个域进行初始化。因为如果域已经被初始化就不会有锁定,域被声明为volatile很重要。

5、如果可以接收重复初始化,也可以考虑使用单重检查模式(single check idiom)

private volatile FieldType field;
private FieldType getField(){
    FieldType result = field;
        if(result == null){
            field = result = computeFieldValue();
    return result;
}

 

以上是关于Effective Java 之-----关于延迟初始化的主要内容,如果未能解决你的问题,请参考以下文章

关于阅读java编程思想和effective java的一些看法

Java:Effective java学习笔记之 考虑实现Comparable 接口

Java:Effective java学习笔记之 始终要覆盖toString方法

Java:Effective java学习笔记之 避免使用终结方法

Effective Java 读书笔记之八 异常

Java:Effective java学习笔记之 列表优先于数组