实现单例模式的五种方式

如何实现一个单例

1、构造器需要私有化

2、提供一个私有的静态变量

3、暴露一个公共的获取单例对象的接口

需要考虑的两个问题

1、是否支持懒加载

2、是否线程安全

1、饿汉式
java 复制代码
public class EagerSingleton {
    private static final EagerSingleton INSTANCE = new EagerSingleton();

    private EagerSingleton(){}

    public EagerSingleton getInstance(){
        return INSTANCE;
    }

}

不支持懒加载

线程安全

2、懒汉式
java 复制代码
public class LazySingleton {
    private static LazySingleton INSTANCE;

    private LazySingleton() {
    }

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

支持懒加载

线程不安全

java 复制代码
public class LazySingleton {
    private static LazySingleton INSTANCE;

    private LazySingleton() {
    }

    public static synchronized LazySingleton getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new LazySingleton();
        }
        return INSTANCE;
    }
}

支持懒加载

线程安全

3、双重检查锁
java 复制代码
public class DoubleCheckSingleton {
    private static DoubleCheckSingleton INSTANCE;

    private DoubleCheckSingleton() {
    }

    public DoubleCheckSingleton getInstance() {
        if (INSTANCE == null) {
            synchronized (DoubleCheckSingleton.class) {
                if (INSTANCE == null) {
                    INSTANCE = new DoubleCheckSingleton();
                }
            }
        }
        return INSTANCE;
    }
}

支持懒加载

线程安全

4、静态内部类
java 复制代码
public class InnerSingleton {
    private InnerSingleton() {
    }

    public static InnerSingleton getInstance() {
        return Singleton.INSTANCE;
    }

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

支持懒加载

线程安全

5、枚举
java 复制代码
public enum EnumSingleton {
    INSTANCE;
}

支持懒加载

线程安全

相关推荐
黎雁·泠崖9 小时前
Java面向对象:this关键字+构造方法+标准JavaBean
java·开发语言·python
sheji34169 小时前
【开题答辩全过程】以 基于Java的智慧环卫垃圾收运管理系统设计与实现为例,包含答辩的问题和答案
java·开发语言
jason成都9 小时前
实战 | 国产数据库 R2DBC-JDBC 桥接踩坑记 - JetLinks适配达梦数据库
java·数据库·物联网
BullSmall9 小时前
SEDA (Staged Event-Driven Architecture, 分阶段事件驱动架构
java·spring·架构
Coder_Boy_10 小时前
基于SpringAI的在线考试系统-DDD(领域驱动设计)核心概念及落地架构全总结(含事件驱动协同逻辑)
java·人工智能·spring boot·微服务·架构·事件驱动·领域驱动
黎雁·泠崖10 小时前
Java&C语法对比:分支与循环结构核心全解析
java·c语言
鹿角片ljp10 小时前
Java IO流案例:使用缓冲流恢复《出师表》文章顺序
java·开发语言·windows
毕设源码-郭学长10 小时前
【开题答辩全过程】以 广告投放管理系统为例,包含答辩的问题和答案
java
小北方城市网10 小时前
SpringBoot 集成 RabbitMQ 实战(消息队列解耦与削峰):实现高可靠异步通信
java·spring boot·python·微服务·rabbitmq·java-rabbitmq·数据库架构
java_t_t10 小时前
Maven插件apiscan介绍与使用
java·maven·api文档·maven插件