实例域 延迟初始化 可以采用 synchronize方法或者 双重校验锁来完成
类实例域 采用 lazy initialization holder class 模式
正常初始化 优先于 延迟初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package book.effectiveJava;

public class _71HadBetterNotLazyInitClass {

private static class Holder{
//延迟初始化方式类变量 1
private static final Target target= new Target();
public static Target getTarget(){
return target;
}
}

private static class Target{

public InnerTarget instance ;

private Target(){

}

//延迟初始化 字段变量2
public InnerTarget getTarget(){
if(instance==null){
synchronized (this){
if(instance==null){
instance=new InnerTarget();
}
}
}
return instance;
}

//初始化 类变量 字段
public synchronized InnerTarget getTarget2(){
if(instance==null){
instance=new InnerTarget();
}
return instance;
}
private static class InnerTarget{

}
}

public static void main(String[] args) {
Object obj1 = Holder.getTarget().getTarget();
Object obj2 = Holder.getTarget().getTarget();
System.out.println(obj1==obj2);
}
}