单例模式的五种实现方式
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类就是通过饿汉式的方式实现的单例模式