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

Posted christmad

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了延迟初始化中的 双重检查模式 和 延迟占位类模式 你都用对了吗?相关的知识,希望对你有一定的参考价值。

开篇:

正如《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     }

 

 

以上是关于延迟初始化中的 双重检查模式 和 延迟占位类模式 你都用对了吗?的主要内容,如果未能解决你的问题,请参考以下文章

单例模式双重检查锁定与延迟初始化你不得不知道的底层原理

单例模式双重检查锁定与延迟初始化你不得不知道的底层原理

双重检查锁定的单例模式和延迟初始化

单例模式你不得不知道的底层原理

双重检查锁定与延迟优化

线程安全的单例模式