实现单例模式的五种方式

如何实现一个单例

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·开发语言
Kiling_07049 小时前
Java集合框架:List集合详解与应用
java·开发语言·windows
极客先躯9 小时前
高级java每日一道面试题-2025年12月08日-实战篇[Docker]-如何为 Docker 配置代理?如何为容器配置代理?
java·docker·代理配置的双层架构·docker 守护进程配置代理·为容器配置代理·构建时环境变量·运行时注入环境变量
csdn2015_9 小时前
java springboot 文件导入,判断第一列的值是否有重复
java·windows·spring boot
~|Bernard|9 小时前
四,go语言中GMP调度模型
java·前端·golang
Tisfy9 小时前
LeetCode 2553.分割数组中数字的数位:模拟(maybe+翻转)——java也O(1)
java·数学·算法·leetcode·题解·模拟·取模
怪祝浙9 小时前
从简单项目入手Java(学生系统)V6(Web版本 Spring Boot3 MySQL Vue3 MyBatis)
java·spring boot·mysql
吴声子夜歌10 小时前
Java——Integer与二进制算法
java·算法
风味蘑菇干10 小时前
继承 + static + final 综合应用
java·开发语言
li星野10 小时前
二分查找六题通关:从标准模板到旋转数组(Python + C++)
java·c++·python