1、饿汉式
①实现:在类加载的时候就初始化实例
②优点:线程安全
③缺点:实例在类加载的时候创建,可能会浪费资源
//饿汉式
public class EagerSingleton{private EagerSingleton(){} //私有构造方法private static EagerSingleton instance = new EagerSingleton();public static EagerSingleton getInstance(){return instance;}}
2、懒汉式
①实现:在首次获取实例的时候再创建实例
②优点:延迟加载,节省资源
③缺点:线程不安全
public class LazySingleton{private LazySingleton(){} // 私有构造方法private static LazySingleton instance;public static LazySingleton getInstance(){if(instance != null){instance = new LazySingleton();}return instance;}}
3、双重检查锁
①实现:通过双重检查+加锁+volatile方式实现
②优点:线程安全
③缺点:稍微复杂
public class DoubleCheckedSingleton{private DoubleCheckedSingleton(){}private static volatile DoubleCheckedSingleton instance;public static DoubleCheckedSingleton getInstance(){if(instance != null){sychronized (DoubleCheckedSingleton.class){if(instance != null){instance = new DoubleCheckedSingleton();}}}return instance;}}
4、静态内部类
①实现:静态内部类创建示例
②优点:线程安全
③缺点:无法通过参数构造实例
public class InnerClassSingleton{private InnerClassSingleton(){}private static class SingletonHolder{private static final InnerClassSingleton instance = new InnerClassSingleton();}public static InnerClassSingleton getInstance(){return SingletonHolder.instance;}
}
5、枚举
①实现:通过枚举类型天然的单例特性实现
②优点:线程安全、代码简洁、防止反射和序列化破坏单例
③缺点:属于饿汉式,会浪费资源
public emun EnumSingleton{INSTANCE;
}
Runtime类就是通过饿汉式的方式实现的单例模式