实现单例模式的五种方式

如何实现一个单例

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

支持懒加载

线程安全

相关推荐
狂团商城小师妹2 小时前
JAVA国际版同城打车源码同城服务线下结账系统源码适配PAD支持Android+IOS+H5
android·java·ios·小程序·交友
m0_736927042 小时前
Java面试场景题及答案总结(2025版持续更新)
java·开发语言·后端·职场和发展
何中应2 小时前
IDEA实用快捷键
java·ide·intellij-idea
lkbhua莱克瓦243 小时前
Java练习——正则表达式2
java·开发语言·笔记·正则表达式·github·学习方法
鬼火儿3 小时前
MySQL系列之数据类型(String)
java·后端
江湖人称小鱼哥3 小时前
Jenkins 在构建 Java 项目并操作 Docker 时 CPU 会突然飙高
java·docker·jenkins
Violet_YSWY3 小时前
Iterable<Result<Item>>讲一下
java
懒羊羊不懒@3 小时前
JavaSe—List集合系列
java·开发语言·数据结构·人工智能·windows
蓝-萧3 小时前
【Java】如何使用jdbc连接并操作MySQL,一文读
java·后端
qianbailiulimeng3 小时前
【MySQL】mysqldump使用方法
java·后端