`

单例延迟实例化

    博客分类:
  • 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方法没有被同步,因此延迟初始化实际上并没有增加任何访问成本。
分享到:
评论

相关推荐

    Spring 延迟实例化

    ### Spring 延迟实例化的理解与应用 #### 一、Spring框架简介 Spring框架是一个开源的Java平台,它提供了一种全面的方式来构建应用程序。Spring的核心特性包括依赖注入(Dependency Injection, DI)和面向切面编程...

    java单例模式实例

    这种实现方式是在类被首次请求时才创建单例对象,延迟了初始化过程,从而提高了程序的启动性能。但这种方式有一个问题,即线程不安全。在多线程环境下,可能会创建多个实例。例如: ```java public class Singleton...

    JAVA 静态的单例的实例详解

    使用静态单例模式可以实现延迟加载,因为静态单例对象没有作为类的成员变量直接实例化,在第一次调用 newInstance() 方法时才会加载内部类 CreatePrinter,并实例化 mPrinter 变量。这可以减少系统的负载,提高系统...

    C# 单例模式小实例

    - **序列化**:如果单例需要支持序列化,需要处理`OnDeserialized`方法,避免在反序列化时创建额外的实例。 - **生命周期管理**:考虑清楚单例何时被释放,避免内存泄漏。 ### 4. 其他变体 - **枚举单例**:利用C#...

    Java单例模式实例简述

    Java单例模式是一种常见的设计模式,它在软件开发中用于控制类的实例化过程,确保在任何情况下,对于特定类,系统中只有一个实例存在。这种模式对于那些需要频繁创建和销毁的对象,或者需要全局访问的对象,如配置...

    Java单例模式设计

    懒汉单例在第一次调用`getInstance`方法时才进行实例化,因此叫做懒加载。原始的懒汉单例在多线程环境下不安全,如下所示: ```java public class Singleton { private static Singleton instance; private ...

    java单例模式代码实例

    3. 控制实例化过程:可以控制实例化过程,如初始化资源、设置默认值等。 三、单例模式的缺点 1. 扩展困难:如果需要扩展,则很难对单例进行修改或扩展,因为它只能有一个实例。 2. 难以测试:单例对象难以在测试中...

    java 单例设计模式

    单例模式的关键在于限制类的实例化,防止多个实例的存在。 在Java中实现单例有多种方法,下面详细讨论给定文件中提到的五种方式: 1. **懒汉式(非线程安全)**: 这种实现方式延迟初始化,只有在第一次调用`...

    几种单例模式说明(并有实例)

    // 私有构造函数防止外部实例化 private LazySingleton() {} // 同步方法确保线程安全 public static synchronized LazySingleton getInstance() { if (m_intance == null) { m_intance = new LazySingleton...

    Python单例模式实例详解

    懒汉式单例在第一次被请求时才创建实例,延迟了实例化的时间,但需要处理多线程环境下的同步问题。在Python中,可以使用`threading.Lock()`来确保线程安全。 ```python class Singleton LazySingleton: _instance...

    Kotlin 单例实例详解

    在这个例子中,`Hello`类的构造器被声明为`private`,防止外部直接实例化。然后在同伴对象中,我们定义了一个公共的、不可变的(`val`)属性`instance`,并初始化为`Hello()`。由于构造器是私有的,`instance`成为...

    五种单例模式

    懒汉式单例在类第一次被请求时才进行实例化,延迟了实例化的时间。但这种方式在多线程环境下可能存在问题,需要进行同步处理。 ```java public class Singleton { private static Singleton instance; private ...

    C#单例模式详解 C#单例模式详解C#单例模式详解

    在C#中,单例模式常用于管理共享资源或控制类的实例化过程,以提高性能、节约系统资源,特别是在整个应用程序生命周期内只需要一个对象的情况下。 首先,实现C#单例模式通常有几种常见方法: 1. 饿汉式(静态常量...

    单例模式概念与实例(简单实例)

    - 在类加载的时候就完成了实例化,避免了线程同步的问题。 - 实例化发生在类加载时,因此不存在多线程问题。 - **优点**: - 简单易懂,易于实现。 - **缺点**: - 类加载时就完成了初始化,浪费了资源。 #### ...

    Java单例类

    在上面的代码中,我们使用了HashMap来存储注册式单例对象,并且使用Class.forName()方法来实例化对象。 注册式单例的继承 注册式单例可以继承,并且可以在子类中实例化对象。代码实现如下: ```java package ...

    单例模式(C# 实例 源码-经典3分)

    在C#中实现单例模式,可以有效地控制资源的使用,限制类的实例化次数,尤其适用于需要频繁实例化然后销毁的对象或者创建对象耗时较大、需要长期存在的场景。 在C#中,我们可以采用多种方式来实现单例模式: 1. **...

    java单例设计模式的好处

    - **懒汉式单例**:延迟实例化,只有在首次需要时才创建实例。这种方式在Java中较为常见,但在多线程环境下,如果不加同步控制,可能会导致多个线程同时创建实例,因此通常会使用`synchronized`关键字保证线程安全。...

    单例模式演示PPT和实例

    3. **登记式**(Registry,又称双重检查锁定):结合了前两种方式的优点,既延迟了实例化,又保证了线程安全。它在初始化实例时会进行两次检查,第一次是在类加载时,第二次是在同步块内,以避免不必要的同步开销。 ...

    php实现singleton()单例模式实例

    3. 延迟加载:实例化工作通常放在类的静态方法或属性中进行。 PHP实现单例模式通常通过以下步骤完成: 1. 私有化构造函数,防止通过new操作符直接实例化对象。 2. 私有化克隆方法,防止通过clone操作符复制对象。 3...

Global site tag (gtag.js) - Google Analytics