单例

单例模式详解及六种实现方式

一、单例模式的定义

单例模式确保一个类只有一个实例,并提供该实例的全局访问点。这种模式避免了频繁创建和销毁实例,从而节约系统资源。

二、单例模式的设计要素

  1. 私有构造函数:防止其他类创建实例。
  2. 私有静态变量:存储唯一实例。
  3. 公有静态方法:提供全局访问点。

三、单例模式的六种实现及其优缺点

1. 懒汉式(线程不安全)

  • 实现
public class Singleton {
    private static Singleton instance;

    // 私有构造函数防止外部实例化
    private Singleton() {}

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

  • 优点:延迟实例化,节约资源。
  • 缺点:线程不安全,多线程环境下可能实例化多个实例。

2. 饿汉式(线程安全)

  • 实现
public class Singleton {

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

    // 私有构造函数防止外部实例化
    private Singleton() {}

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


}
  • 优点:提前实例化,避免线程安全问题。
  • 缺点:可能浪费系统资源。

3. 懒汉式(线程安全)

  • 实现
public class Singleton {
    private static Singleton uniqueInstance;

    private static singleton() {
    }

    private static synchronized Singleton getUinqueInstance() {
        if (uniqueInstance == null) {
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
}
  • 优点:延迟实例化,节约资源,线程安全。
  • 缺点:性能降低。

4. 双重检查锁实现(线程安全)

  • 实现
public class Singleton {

    private volatile static Singleton uniqueInstance;

    private Singleton() {
    }

    public static Singleton getUniqueInstance() {
        if (uniqueInstance == null) {
            synchronized (Singleton.class) {
                if (uniqueInstance == null) {
                    uniqueInstance = new Singleton();
                }
            }
        }
        return uniqueInstance;
    }  
}
  • 优点:延迟实例化,节约资源,线程安全,性能提高。
  • 缺点:对性能有些影响。

5. 静态内部类实现(线程安全)

  • 实现
public class Singleton {

    private Singleton() {
    }

    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getUniqueInstance() {
        return SingletonHolder.INSTANCE;
    }

}
  • 优点:延迟实例化,节约资源,线程安全,性能提高。

6. 枚举类实现(线程安全)

  • 实现
public enum Singleton {

    INSTANCE;

    //添加自己需要的操作
    public void doSomeThing() {

    }

}
  • 优点:简单、线程安全、防止反射和反序列化调用。

四、单例模式的应用场景

  • 网站计数器。
  • 应用程序的日志应用。
  • Web项目中的配置对象的读取。
  • 数据库连接池。
  • 多线程池等。

单例模式适用于频繁实例化又销毁的对象,或者经常使用但实例化耗费资源的对象。

在Spring中,单例模式是一种常见的设计模式,被广泛运用于Bean的管理。在Spring中,默认情况下,所有的Bean都是单例的,这意味着在整个应用程序生命周期中,Spring容器只会创建一个共享的实例。

Spring中的单例模式应用:

  1. 默认单例:Spring容器在启动时创建Bean实例,并在整个应用程序中共享这个实例。

  2. 配置单例:通过在Bean定义中设置scope="singleton"来明确指定一个Bean为单例。

<bean id="mySingletonBean" class="com.example.MySingletonBean" scope="singleton"/>
  1. 注解方式:通过在类上使用@Component或其他专门的注解,Spring容器会自动将该类注册为单例Bean。
@Component
public class MySingletonBean {
    // Bean properties and methods
}
  1. 生命周期管理:Spring容器负责管理单例Bean的生命周期,包括实例化、初始化、调用和销毁。

  2. 线程安全性:Spring容器确保单例Bean的线程安全性,可以在多线程环境中正确地管理和使用单例Bean。

ref:[1] [https://www.nowcoder.com/exam/test/80609875/submission?examPageSource=Intelligent&pid=57097226&testCallback=https%3A%2F%2Fwww.nowcoder.com%2Fexam%2Fintelligent%3FquestionJobId%3D10%26tagId%3D21001&testclass=软件开发]

posted @ 2024-06-04 13:58  菠萝包与冰美式  阅读(5)  评论(0编辑  收藏  举报