实现单例模式的五种方式

如何实现一个单例

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;
}

支持懒加载

线程安全

相关推荐
沉默-_-3 分钟前
力扣hot100双指针专题解析2(C++)
java·c++·算法·蓝桥杯·双指针
Jaxson Lin5 分钟前
Java编程进阶:智能仿真无人机项目1.0
java·开发语言
sheji341613 分钟前
【开题答辩全过程】以 实验室设备管理系统为例,包含答辩的问题和答案
java
江君是实在人18 分钟前
java 面试题 redis 处理大key问题
java·开发语言·redis
Filotimo_23 分钟前
Spring MVC 注解家族
java
进击的小头30 分钟前
创建型模式:单例模式(C语言实现与实战)
c语言·开发语言·单例模式
禁默34 分钟前
Portainer:让 Docker 管理变简单,用cpolar突破局域网后协作更轻松
java·docker·容器·cpolar
麦兜*38 分钟前
SpringBoot 3.x新特性全面解析:从Java 17支持到GraalVM原生镜像
java·spring boot·后端
醇氧1 小时前
Spring WebFlux 学习
java·学习·spring
烤麻辣烫1 小时前
23种设计模式(新手)-9单例模式
java·开发语言·学习·设计模式·intellij-idea