单例模式共分为三种方式、饿汉式、懒汉式、枚举方式等,每种方式都有各自的特点:
方式 | 优点 | 缺点 | 是否推荐 | 使用场景 |
饿汉式 | 无线程安全问题 | 可能造成内存浪费、无懒加载效应 | 推荐 | 源码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; }
以上几种方式,都算是比较完美的,项目中可以正常使用,懒汉式采用静态内部类的方式解决了线程安全的问题以及懒加载等,还有其余几种懒汉式的方式,比如双重锁等方式,个人不推荐,最推荐的方式是使用枚举。