`

单例延迟实例化

    博客分类:
  • Java
阅读更多


1.如果出于性能的考虑而需要对实例域使用延迟初始化,就使用双重检查模式(double-check idiom)。这种模式避免了在域被初始化后访问这个域时的锁定开销。注意到实例域使用了volatile修饰符。
    //Double-check idiom for lazy initialization of instance fields  
    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 = computeFieldVale();  
            }  
        }  
        return result;  
    }  

     使用局部变量result的目的是为了提升性能。



2.如果出于性能的考虑而需要对静态域使用延迟初始化,就使用Lazy Initialization Holder Class模式。
    // Lazy Initialization holder class idiom for static fields  
    private static class FieldHolder {  
        static final FieldType field = computeFieldValue();  
    }  
    static FieldType getField() { return FieldHolder.field;}  

这种模式的魅力在于getField方法没有被同步,因此延迟初始化实际上并没有增加任何访问成本。
分享到:
评论

相关推荐

    singleton-js:包装函数,用于从类生成单例

    使用Singleton JS方法,您可以将一个单例定义为延迟实例化或立即实例化,但是以与常规类相同的方式(例如new MySingleton() )对待它,并始终返回相同的实例!原料药单例(类[,选项]) 从一个类创建一个单例。 ...

    C#单例模式(Singleton Pattern)实例教程

    主要介绍了C#单例模式(Singleton Pattern)的实现方法,主要讲述了即时加载的单例模式、延迟加载的单例模式与线程安全的单例模式,需要的朋友可以参考下

    backbone-singleton:包装函数,用于从Backbone类生成单例

    骨干单身关于BackboneSingleton 简而言之,它... 使用BackboneSingleton方法,您可以将一个单例定义为延迟实例化或立即实例化,但是以与常规Backbone类(例如new MySingleton() )相同的方式对待它,并始终返回相同的实

    单例模式与工厂模式.docx

    工厂方法使一个类 的实例化延迟到其子类。) Product 为抽象产品类负责定义产品的共性,实现对事物最抽象的定义; Creator 为抽象创建类,也就是抽象工厂,具体如何创建产品类是由具体的实现工 厂 ConcreteCreator...

    单例设计模式实现总结

    单例模式的总体概述 单例模式,属于创建型模式,《设计模式》一书对它做了定义:保证一个类仅有一个...延迟初始化 防止反射攻击 防止序列化破坏单例模式 多种实现方式与比较 线程安全的饿汉模式 public class HungryS

    UnitySingleton:在Unity中实现单例模式的最佳方法

    如果延迟加载无法使用它们,则实例化Singleton对象 您可以在检查器中为预加载场景中的单例对象配置字段 入门 。 在Unity中打开项目。 通过扩展泛型来创建自己的Singleton类 类。 将您的单例类附加到_Preload场景...

    java设计模式

    java设计模式设计模式主要分三个类型:创建型、结构型和行为型。... 三、Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类。

    elasticsearch-aerospike-filter:一个本机脚本过滤器示例,查询aerospike进行过滤

    将Aerospike连接保持在单例状态确保单例的实例化在建立ES连接之前进行(万岁依赖注入!)注意事项由于这是一个脚本过滤器,因此它一个接一个地获取文档。 会看看我们是否可以以某种方式优化它。 不会为每个文档调用...

    java-design-patterns:Java中设计模式实现的小代码段

    辛格尔顿单例模式是一种软件设计模式,它将类的实例化限制为一个“单个”实例。 当仅需要一个对象来协调整个系统中的动作时,这很有用。 这种模式可确保一个类仅具有一个实例,并提供对其的全局访问点。建造者构建器...

    Spring 3 Reference中文

    4.8.3 使用FactoryBean 来自定义实例化逻辑. 84 4.9 基于注解的容器配置. 85 4.9.1 @Required.. 86 4.9.2 @Autowired和@Inject.. 86 4.9.3 使用限定符来微调基于注解的自动装配 89 4.9.4 ...

    Java设计模式.docx

    工厂模式:工厂模式是一种创建型模式,它定义了一个用于创建对象的接口,让子类决定实例化哪个类。 单例模式:单例模式是一种创建型模式,它保证一个类只有一个实例,并提供了全局访问点。 适配器模式:适配器模式是...

    fast-inject:一个轻量级的Node.js依赖注入容器

    快速注入 Node.js的轻量级依赖项注入容器。Node.js支持该库当前支持Node.js> = ... 服务也是延迟加载的,因此只有在访问服务时才会实例化。 要设置容器,您只需创建一个Injector实例并注册常量和/或服务。 const { I

    spring-experiement

    目的 该项目测试了运行静态块和Spring bean初始化的顺序 实验:静态块可以访问自动装配的对象吗?... 由于Spring必须实例化该类(这肯定需要加载该类),然后才能在该实例上调用setter,因此静态初始化程序块已经运行。

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例150 实例化Class类的5种方式 196 实例151 获得Class对象表示实体的名称 197 实例152 查看类的声明 198 实例153 查看类的成员 199 实例154 按继承层次对类排序 201 实例155 查看内部类信息 202 7.2 反射的进阶 ...

    DesignPattern:Java设计模式

    只要应用中不使用内部类 JVM 就不会去加载这个单例类,也就不会创建单例对象,从而实现懒汉式的延迟加载和线程安全。 饿汉模式 否 慢 快 是 单例对象初始化非常快,而且占用内存非常小的时候这种方式是比较合适的,...

Global site tag (gtag.js) - Google Analytics