Java单例模式:饿汉式与懒汉式

Java单例模式:饿汉式与懒汉式

在Java中,单例模式是一种设计模式,用于确保一个类只有一个实例,并提供全局访问点。常见的单例模式有饿汉式和懒汉式两种实现方式。

1.饿汉式单例模式:

在饿汉式单例模式中,实例在类加载时就被创建,并且在整个应用程序生命周期内都存在。

public class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton() {
        // 私有构造函数
    }

    public static Singleton getInstance() {
        return instance;
    }
}

在上面的代码中,instance是一个私有静态成员变量,它在类加载时就被初始化为Singleton的实例。通过公共静态方法getInstance()来获取该实例。

优点:

  • 实现简单,线程安全。
  • 在类加载时就创建实例,避免了多线程环境下的线程安全问题。

缺点:

  • 如果该实例很大或者初始化需要耗费较多资源,会导致应用程序启动较慢。
  • 不支持延迟加载,可能会造成资源浪费。
  • 在多线程状态下,可能会出现同时存在多个实例的问题。

2.懒汉式单例模式:

在懒汉式单例模式中,实例在首次使用时才被创建。

public class Singleton {
    private static Singleton instance;

    private Singleton() {
        // 私有构造函数
    }

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

在上面的代码中,instance是一个私有静态成员变量,初始值为null。通过公共静态方法getInstance()来获取实例。在方法内部,首先检查instance是否为null,如果是,则创建一个新的Singleton实例并将其赋值给instance

优点:

  • 支持延迟加载,只有在需要时才创建实例,节省了资源。
  • 线程安全,通过synchronized关键字保证在多线程环境下只有一个线程可以创建实例。

缺点:

  • 在多线程环境下,可能会存在性能问题,因为每次调用getInstance()方法都需要进行同步操作。

需要注意的是,以上代码如果在多线程环境下使用,需要考虑线程安全性。对于懒汉式单例模式,可以使用双重检查锁定(double-checked locking)或者静态内部类的方式来提高性能和线程安全性。

© 版权声明
THE END
喜欢就支持一下吧
点赞37 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容