首页 > 其他分享 >单例

单例

时间:2024-06-04 14:16:01浏览次数:9  
标签:Singleton uniqueInstance 实例 线程 单例 public

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

一、单例模式的定义

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

二、单例模式的设计要素

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

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

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

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

     private Singleton() {

    }

    public static Singleton getUniqueInstance() {
        if (uniqueInstance == null) {
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
}
  • 优点:延迟实例化,节约资源。
  • 缺点:线程不安全,多线程环境下可能实例化多个实例。

2. 饿汉式(线程安全)

  • 实现
public class Singleton {

    private static Singleton uniqueInstance = new Singleton();

    private Singleton() {
    }

    public static Singleton getUniqueInstance() {
        return uniqueInstance;
    }

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

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=软件开发]

标签:Singleton,uniqueInstance,实例,线程,单例,public
From: https://www.cnblogs.com/alohablogs/p/18230618

相关文章

  • this,构造器,static,final,单例模式
    this,构造器,static,final,单例模式this关键字在java中this是一个引用变量,即指向当前对象地址的引用(指针),→可以把this当作当前对象,便于更好的索引.this()实际是调用了当前对象的构造器1.引用当前对象的属性当在方法中要访问当前对象的属性时,可以用this来区分局......
  • 单例模式线程安全reorder问题
    单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。下面是一个使用C++实现的线程安全的单例模式的例子:classSingleton{private:staticstd::atomic<Singleton*>instance;//静态私有实例指针使用原子操作类atomic线程安全sta......
  • 说说你对单例模式的理解?如何实现?
     一、是什么单例模式(SingletonPattern):创建型模式,提供了一种创建对象的最佳方式,这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建在应用程序运行期间,单例模式只会在全局作用域下创建一次实例对象,让所有需要调用的地方都共享这一单例对象,如下图所......
  • 设计模式——单例模式
    一。引言当我们写一个体量比较大的代码使,如果这是堆积罗列,那么会发现有许多冗余的情况,并且还不利于团队共同协作,代码难以定位。于是为了解决这些问题,提高代码的可读性,减少耦合度,我们引入了设计模式。设计模式就像盖房子时的图纸,根据这些图纸的指导可以让我们把房子建的更漂......
  • 单例模式(Singleton)
    单例模式(SingletonPattern)是设计模式中最简单也最常见的一种。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在单例模式中,一个类只有一个实例存在,同时该类的实例由一个预先定义好的静态引用变量所持有,以便在整个系统中随时访问它。模式结构与角色单例类......
  • WPF之单例模式
    项目2019/10/09 问题2019年10月9日星期三上午2:461、为了实现单例模式,在App类中添加了如下代码,使用了信号量,但是为什么返回;isNew一直为truepublicpartialclassApp:Application   {       protectedoverridevoidOnStartup(StartupEventArgs......
  • aardio 单例模式
    1//singleton单例模式23importconsole;45importthread;6classsingleton{7ctor(){};8instance;910test=function(){11return"对象";12}1314}1516namespacesingleton{17getInstan......
  • 单例模式c++实现
    单例模式是一种创建型设计模式,它保证一个类仅有一个实例,并提供一个全局访问点来访问这个唯一实例。下面是一个简单的C++实现单例模式的例子:cppincludeincludeclassSingleton{private:staticSingleton*instance;staticstd::mutexmtx;Singleton(){}//私有构造函......
  • [Unity] 单例基类的实现方式
    Unity单例基类的实现方式游戏开发的过程中我们经常会将各种“Manger”类设为单例,以实现单一资源的全局访问。Unity中的单例一般分为两类,一种是直接继承自Object的普通单例,还有一种是需要继承MonoBehaviour的Mono单例。接下来我将会讲解这两种单例基类的实现方式。注意:由于Unity......
  • this,构造器,static,final,单例模式
    this关键字在java中this是一个引用变量,即指向当前对象地址的引用(指针),→可以把this当作当前对象,便于更好的索引.1.引用当前对象的属性当在方法中要访问当前对象的属性时,可以用this来区分局部变量与全局变量.若局部变量和全局变量同名,this指向的属性是全局变量publ......