1、静态内部类
通过静态内部类的方式实现单例模式是线程安全的,同时静态内部类不会在Singleton类加载时就加载,而是在调用getInstance()方法时才进行加载,达到了懒加载的效果。但存在存在反射攻击或者反序列化攻击的可能。
public class StaticSingletonDemo {
private static class SingletonHolder {
private static final StaticSingletonDemo instance=new StaticSingletonDemo();
}
private SingletonDemo(){}
public static StaticSingletonDemo getInstance(){
return SingletonHolder.instance;
}
}
2、枚举类
通过枚举实现单例模式是线程安全的,利用枚举的特性(枚举元素本身就是单例),虽不能懒加载,但可以天然的防止反射和反序列化调用
public enum EnumSingletonDemo {
// 枚举元素本身就是单例
INSTANCE;
public void doSomething(){
// 实现自己的逻辑
}
}
3、如何选用
使用枚举类:单例对象占用资源少,不需要延时加载,好于 饿汉
使用静态内部类:单例对象占用资源多,需要延时加载,好于 懒汉式