zoukankan      html  css  js  c++  java
  • 延迟初始化中的 双重检查模式 和 延迟占位类模式 你都用对了吗?

    开篇:

    正如《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     }
  • 相关阅读:
    Array.of()和Array()区别
    less常用方法
    javascript时间戳转换成yyyy-MM-DD格式
    javascript中标准事件流addEventListener介绍
    javascript中模块化知识总结
    搜索栏简单小案例
    css3伸缩布局中justify-content详解
    css3动画简单案例
    正则表达式的语法
    Beautisoup库
  • 原文地址:https://www.cnblogs.com/christmad/p/12019640.html
Copyright © 2011-2022 走看看