【C#】五种单例模式详解

单例模式有五种:

饿汉模式、懒汉模式、双重锁懒汉模式、静态内部类模式、枚举模式。

1.饿汉式

public class SingleTon1 {

private static SingleTon1 instance = new SingleTon1();

复制代码
private SingleTon1() {
}

public SingleTon1 getInstance(){
    return instance;
}

}

饿汉式,名字就能看出来,很饿,所以实例在初始化的时候就已经建好了。优点是没有线程安全的问题,缺点是浪费内存空间。

2.懒汉式(线程不安全的)

public class SingleTon2 {

private SingleTon2 instance;

复制代码
private SingleTon2() {
}
public SingleTon2 getInstance(){
    if (instance == null){
        instance = new SingleTon2();
    }
    return instance;
}

}

懒汉式,顾名思义就是实例在用到的时候才去创建,用的时候才去检查有没有实例,如果有则返回,没有则新建。但是这种会产生线程不安全的情况,会有可能多个线程同时进入if语句判断都没有实例,从而实例化了两个,就不是单例了。

3.双检锁懒汉式(线程安全的)

public class SingleTon3 {

private SingleTon3 instance;

复制代码
private SingleTon3() {
}

public SingleTon3 getInstance() {
    if (instance == null) {
        synchronized (SingleTon3.class) {
            if (instance == null) {
                instance = new SingleTon3();
            }
        }
    }
    return instance;
}

}

双检锁懒汉式,综合了懒汉式和饿汉式两者的优缺点整合而成。看上面代码实现中,特点是在synchronized关键字内外都加了一层 if 条件判断,只有在对象需要被使用时才创建,第一次判断 INSTANCE == null为了避免非必要加锁,当第一次加载时才对实例进行加锁再实例化这样既保证了线程安全,又比直接上锁提高了执行效率,还节省了内存空间。

4.静态内部类单例式

public class SingleTon4 {

private SingleTon4() {

}

复制代码
private static class SingleTonInside {
    private static final SingleTon4 INSTANCE = new SingleTon4();
}

public static SingleTon4 getInstance() {
    return SingleTonInside.INSTANCE;
}

}

静态内部类,优点是:外部类加载时并不需要立即加载内部类,内部类不被加载则不去初始化INSTANCE,故而不占内存。这种方法不仅能确保线程安全,也能保证单例的唯一性,同时也延迟了单例的实例化。

5.枚举单例式

public enum SingleTon5 {

INSTANCE;

复制代码
public void method() {
    
}

}

枚举在java中与普通类一样,都能拥有字段与方法,而且枚举实例创建是线程安全的,在任何情况下,它都是一个单例。但是枚举类不能继承其他类了。从代码实现看,却更简洁清晰。并且它还自动支持序列化机制,绝对防止多次实例化。可以通过下面的方式调用。

SingleTon5.INSTANCE

总结:五种单例模式,最重要,最好的,用的最多的就是第三种双检锁懒汉式和第四种静态内部类式。面试常问,需能够手写这两种,并了解其余三种。如有错误,欢迎指出修改。


版权声明:本文为CSDN博主「卡布达小新」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_56902337/article/details/117171364

相关推荐
重生之我是Java开发战士6 天前
【Java SE】多线程(三):单例模式,阻塞队列,线程池与定时器
java·javascript·单例模式
许彰午7 天前
34_Java设计模式之单例模式
java·单例模式·设计模式
罗超驿9 天前
10.Java单例模式全解析:饿汉式与懒汉式实现及线程安全深度剖析
安全·单例模式·javaee
布朗克1689 天前
33 设计模式精讲
java·单例模式·设计模式
雨浓YN9 天前
基于设计模式的Winform软件框架-01Xml\Log\Ini日志(单例模式+生产者消费者模式)
单例模式·设计模式
仙俊红10 天前
Java 单例模式:类里面为什么可以有自己类型的字段?
java·开发语言·单例模式
swordbob10 天前
prototype 注入到 singleton 里,prototype是否还是线程安全的
安全·spring·单例模式·原型模式
谁似人间西林客12 天前
工业大数据实战:看中国智造如何用数据驱动效率革命
大数据·单例模式
张小姐的猫12 天前
【Linux】多线程 —— 线程池 | 单例模式 | 常见锁
linux·运维·服务器·c++·单例模式·设计模式·策略模式
Java面试题总结13 天前
双重检验锁的单例模式在高并发下的可见性问题
单例模式