单例模式的五种实现方式

1、饿汉式

**①实现:**在类加载的时候就初始化实例

**②优点:**线程安全

**③缺点:**实例在类加载的时候创建,可能会浪费资源

java 复制代码
//饿汉式
public class EagerSingleton{
    
    private EagerSingleton(){}   //私有构造方法
    
    private static EagerSingleton instance = new EagerSingleton();

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

2、懒汉式

**①实现:**在首次获取实例的时候再创建实例

**②优点:**延迟加载,节省资源

**③缺点:**线程不安全

java 复制代码
public class LazySingleton{

    private LazySingleton(){}    //  私有构造方法

    private static LazySingleton instance;

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

}

3、双重检查锁

**①实现:**通过双重检查+加锁+volatile方式实现

**②优点:**线程安全

**③缺点:**稍微复杂

java 复制代码
public class DoubleCheckedSingleton{

    private DoubleCheckedSingleton(){}

    private static volatile DoubleCheckedSingleton instance;

    public static DoubleCheckedSingleton getInstance(){
        if(instance != null){
            sychronized (DoubleCheckedSingleton.class){
                if(instance != null){
                    instance = new DoubleCheckedSingleton();
                }
            }
        }
        return instance;
    }
 }

4、静态内部类

**①实现:**静态内部类创建示例

**②优点:**线程安全

**③缺点:**无法通过参数构造实例

java 复制代码
public class InnerClassSingleton{
    
    private InnerClassSingleton(){}

    private static class SingletonHolder{
        private static final InnerClassSingleton instance = new InnerClassSingleton();
    }
    
    public static InnerClassSingleton getInstance(){
        return SingletonHolder.instance;
    }
}

5、枚举

**①实现:**通过枚举类型天然的单例特性实现

**②优点:**线程安全、代码简洁、防止反射和序列化破坏单例

**③缺点:**属于饿汉式,会浪费资源

java 复制代码
public emun EnumSingleton{
    INSTANCE;
}

Runtime类就是通过饿汉式的方式实现的单例模式

相关推荐
CodeCraft Studio9 分钟前
借助Aspose.HTML控件,在 Python 中将 HTML 转换为 Markdown
开发语言·python·html·markdown·aspose·html转markdown·asposel.html
QQ_43766431410 分钟前
C++11 右值引用 Lambda 表达式
java·开发语言·c++
永卿00110 分钟前
设计模式-迭代器模式
java·设计模式·迭代器模式
aramae10 分钟前
大话数据结构之<队列>
c语言·开发语言·数据结构·算法
使二颗心免于哀伤13 分钟前
《设计模式之禅》笔记摘录 - 10.装饰模式
笔记·设计模式
誰能久伴不乏18 分钟前
Linux如何执行系统调用及高效执行系统调用:深入浅出的解析
java·服务器·前端
封奚泽优33 分钟前
使用Python实现单词记忆软件
开发语言·python·random·qpushbutton·qtwidgets·qtcore·qtgui
慕y27440 分钟前
Java学习第七十二部分——Zookeeper
java·学习·java-zookeeper
midsummer_woo44 分钟前
基于spring boot的医院挂号就诊系统(源码+论文)
java·spring boot·后端
_Aaron___1 小时前
面向对象的三大特性---多态
java