延迟初始化中的 双重检查模式 和 延迟占位类模式 你都用对了吗?

开篇:

正如《Effective Java》第二版中第71条目“慎用延迟初始化”所说:

  大多数的域应该正常的被初始化而不是延迟初始化。如果为了达到性能目标,或者为了破坏有害的初始化循环,而必须延迟初始化一个域,就可以使用相应的延迟初始化方法。

  对于实例域,就使用双重检查模式(double-check idiom);对于静态域,则使用 lazy initialization hodler class idiom。

  对于可以接受重复初始化的实例域,也可以考虑使用单检查模式(single-check idiom)。

 PS:double-check idiom 也有称 double-check lock(DCL)。

实践延迟初始化:

可见,对不同的域(实例域 和 静态域)有不同的延迟初始化模式。

实例域延迟初始化代码,注意实例域是 volatile 声明的:

 1     private volatile Object field;
 2 
 3     private Object getField() {
 4         Object result = field;
 5         if (result == null) {
 6             synchronized (this) {
 7                 result = field;
 8                 if (result == null) {
 9                     field = result = computeFieldValue();
10                 }
11             }
12         }
13         return result;
14     }

静态域延迟初始化代码:

1     private static class FieldHolder {
2         static final Object staticField = computeStaticFieldValue();
3     }
4 
5     public static Object getStaticField() {
6         return FieldHolder.staticField;
7     }
原文地址:https://www.cnblogs.com/christmad/p/12019640.html