单例模式的五种实现方式

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类就是通过饿汉式的方式实现的单例模式

相关推荐
我命由我1234510 分钟前
SQL 检测脚本
java·数据库·sql·功能测试·单元测试·压力测试·可用性测试
lhh_qrsly20 分钟前
OTA 加密完整方案(嵌入式 IoT 常用)
开发语言·物联网·php
Nontee27 分钟前
Quartz 新手入门:定时任务的两个承诺
开发语言·windows·python
Hpc_Fun27 分钟前
GPU 工作站品牌怎么比?五把可核验尺子、加权评分脚本与场景重排
java·信创·gpu工作站·品牌对比·加权评分
const_qiu27 分钟前
第四章 03:4.3 Tools —— 让 Agent 会用工具
java·人工智能
Rain的Java大神之路33 分钟前
百万并发直播弹幕系统设计全解:看懂了扇出,你就看懂了高并发的八成
java·后端·面试
\光辉岁月/1 小时前
2.异常类
java·开发语言·异常类
淡海水1 小时前
05-03-源码-Boehm GC分配与碎片管理
开发语言·算法·unity·c#·游戏引擎·gc
努力实干1 小时前
C++ 面向对象与工程架构
开发语言·c++·架构
代钦塔拉1 小时前
【C++/Qt 进阶】设计模式系列(6):桥接模式——把“两个独立变化的维度“拆开
c++·qt·设计模式