单例模式共分为三种方式、饿汉式、懒汉式、枚举方式等,每种方式都有各自的特点:
| 方式 | 优点 | 缺点 | 是否推荐 | 使用场景 |
| 饿汉式 | 无线程安全问题 | 可能造成内存浪费、无懒加载效应 | 推荐 | 源码Runtime类中使用了饿汉式 |
| 懒汉式 | 懒加载 | 有线程安全问题 | 推荐 | |
| 枚举方式 | 简单、无线程安全问题 | 推荐 |
饿汉式实现方式:
//方式一 静态常量方式
public class Singleton {
// 构造方法私有化
private Singleton() {
}
// 对象私有化
private static final Singleton singleton = new Singleton();
public static Singleton getSingleton() {
return singleton;
}
}
//方式二 静态块方式
class SingletonX {
// 构造方法私有化
private SingletonX() {
}
// 对象私有化
private static SingletonX singleton ;
static {
singleton = new SingletonX();
}
public static SingletonX getSingleton() {
return singleton;
}
}
懒汉式实现方式:
// 静态内部类
public class Singleton2 {
// 构造方法私有化
private Singleton2() {
}
// 通过静态类创建对象
private static class SingletFactory {
private static final Singleton2 INSTANCE = new Singleton2();
}
public static Singleton2 getSingleton() {
return SingletFactory.INSTANCE;
}
}
枚举方式:
public enum Singleton3 {
INSTANCE;
}
以上几种方式,都算是比较完美的,项目中可以正常使用,懒汉式采用静态内部类的方式解决了线程安全的问题以及懒加载等,还有其余几种懒汉式的方式,比如双重锁等方式,个人不推荐,最推荐的方式是使用枚举。



