饿汉式和懒汉式

博客介绍了单例设计模式的饿汉式和懒汉式实现方式。饿汉式在类加载时创建实例,线程安全但可能浪费资源;懒汉式在首次使用时创建实例,节省资源但需考虑线程安全。还给出示例代码,并建议根据具体需求和场景选择合适方式。

饿汉式(Eager Initialization)和懒汉式(Lazy Initialization)是两种常见的单例设计模式的实现方式。

  1. 饿汉式:

    • 在类加载时就创建实例对象,并且始终保持一个实例
    • 在类的静态变量中直接创建实例,并在静态代码块或者静态方法中进行初始化。
    • 优点是线程安全,因为实例在类加载时就创建,不会存在多线程竞争的问题
    • 缺点是在应用程序启动时就创建实例,可能会造成资源的浪费,尤其是在实例较大或创建实例的过程较为耗时的情况下。
  2. 懒汉式:

    • 在首次使用时才创建实例对象。
    • 延迟初始化实例,一般在需要时通过判断实例是否为空来创建实例。
    • 优点是节省了资源,在实例不被使用时不会进行初始化。
    • 缺点是需要考虑线程安全性,在多线程环境下需要进行额外的同步控制,以避免多个线程同时创建实例的问题。

以下是简单的示例代码:

// 饿汉式
public class EagerSingleton {
    private static final EagerSingleton instance = new EagerSingleton();
    
    private EagerSingleton() {
        // 私有化构造函数
    }
    
    public static EagerSingleton getInstance() {
        return instance;
    }
}

// 懒汉式
public class LazySingleton {
    private static LazySingleton instance;
    
    private LazySingleton() {
        // 私有化构造函数
    }
    
    public static synchronized LazySingleton getInstance() {
        if (instance == null) {
            instance = new LazySingleton();
        }
        return instance;
    }
}

在饿汉式中,实例在类加载时就创建,因此可以直接通过 EagerSingleton.getInstance() 获取实例。

在懒汉式中,实例在首次调用 LazySingleton.getInstance() 时创建。需要注意的是,为了保证线程安全,上述示例中的 getInstance() 方法使用了 synchronized 关键字进行同步控制。这种同步方式可以确保在多线程环境下只有一个线程能够创建实例,但在高并发环境下会存在性能问题。

需要根据具体的需求和场景选择适合的单例实现方式。如果实例的创建和初始化过程较为耗时,并且在应用程序启动时就需要使用该实例,可以考虑使用饿汉式。如果实例的创建比较轻量且在应用程序运行过程中可能不会被使用,可以考虑使用懒汉式。同时,在多线程环境下需要注意线程安全性。

 

 

【多变量输入超前多步预测】基于CNN-BiLSTM的光伏功率预测研究(Matlab代码实现)内容概要:本文介绍了基于CNN-BiLSTM模型的多变量输入超前多步光伏功率预测方法,并提供了Matlab代码实现。该研究结合卷积神经网络(CNN)强大的特征提取能力与双向长短期记忆网络(BiLSTM)对时间序列前后依赖关系的捕捉能力,构建了一个高效的深度学习预测模型。模型输入包含多个影响光伏发电的气象与环境变量,能够实现对未来多个时间步长的光伏功率进行精确预测,适用于复杂多变的实际应用场景。文中详细阐述了数据预处理、模型结构设计、训练流程及实验验证过程,展示了该方法相较于传统模型在预测精度稳定性方面的优势。; 适合人群:具备一定机器学习深度学习基础,熟悉Matlab编程,从事新能源预测、电力系统分析或相关领域研究的研发人员与高校研究生。; 使用场景及目标:①应用于光伏电站功率预测系统,提升电网调度的准确性与稳定性;②为可再生能源并网管理、能量存储规划及电力市场交易提供可靠的数据支持;③作为深度学习在时间序列多步预测中的典型案例,用于科研复现与教学参考。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注数据归一化、CNN特征提取层设计、BiLSTM时序建模及多步预测策略的实现细节,同时可尝试引入更多外部变量或优化网络结构以进一步提升预测性能。
### 饿汉式懒汉的定义及特点 #### 饿汉式(Eager Initialization) 饿汉式是一种在类加载时就完成实例化的单例模式实现方。这种方的优点在于简单易懂,线程安全无需额外处理,因为静态变量 `instance` 的初始化是由 JVM 完成的[^2]。 以下是饿汉式的典型代码实现: ```java public class EagerSingleton { private static final EagerSingleton instance = new EagerSingleton(); private EagerSingleton() { // 私有构造函数,防止外部实例化 } public static EagerSingleton getInstance() { return instance; } } ``` 这种实现在类加载阶段就会创建对象,因此无论是否实际使用该对象都会占用内存资源。 --- #### 懒汉(Lazy Initialization) 懒汉则是在第一次调用 `getInstance()` 方法时才会创建实例,从而实现了延迟加载的效果。其主要优点是可以节省系统资源,但在多线程环境中需要注意线程安全问题[^1]。 以下是未加锁的懒汉实现(线程不安全): ```java public class LazySingleton { private static LazySingleton instance; private LazySingleton() {} public static LazySingleton getInstance() { if (instance == null) { // 可能存在并发问题 instance = new LazySingleton(); } return instance; } } ``` 为了保证线程安全,可以采用同步机制。最常见的方是对整个方法加上 `synchronized` 锁,但这会降低性能[^3]: ```java public class ThreadSafeLazySingleton { private static ThreadSafeLazySingleton instance; private ThreadSafeLazySingleton() {} public static synchronized ThreadSafeLazySingleton getInstance() { if (instance == null) { instance = new ThreadSafeLazySingleton(); } return instance; } } ``` 更高效的解决方案是双重检查锁定(Double-Checked Locking),它既保证了线程安全又提高了性能[^5]: ```java public class DoubleCheckLockingSingleton { private volatile static DoubleCheckLockingSingleton instance; private DoubleCheckLockingSingleton() {} public static DoubleCheckLockingSingleton getInstance() { if (instance == null) { // 第一次检查 synchronized (DoubleCheckLockingSingleton.class) { if (instance == null) { // 第二次检查 instance = new DoubleCheckLockingSingleton(); } } } return instance; } } ``` --- ### 主要区别总结 | 特性 | 饿汉式 | 懒汉 | |--------------------|------------------------------------------|--------------------------------------------| | **实例化时机** | 类加载时立即创建 | 调用 `getInstance()` 时按需创建 | | **线程安全性** | 天然线程安全 | 需要手动处理线程安全 | | **资源消耗** | 不管是否使用都占用内存 | 延迟加载,仅在必要时占用内存 | | **适用场景** | 实例一定会被频繁使用的场合 | 实例可能很少使用或者不确定是否会使用的场合 | --- ### 枚举单例作为补充说明 除了上述两种常见的单例模式外,还可以通过枚举的方来实现单例。这种方法不仅天然支持线程安全,还能有效抵御反序列化反射攻击: ```java public enum EnumSingleton { INSTANCE; public void doSomething() { System.out.println("Doing something..."); } } // 使用方 EnumSingleton.INSTANCE.doSomething(); ``` 尽管枚举单例功能强大,但它并不属于传统意义上的饿汉式懒汉范畴。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小懒懒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值