单例模式的实现及优缺点简单记录:
单例模式使用场景:项目需要频繁的进行对象的创建和销毁,为了节省系统资源,推荐使用单例模式。即防止使用者new 新建对象,通过静态的getInstance()方法获取对象实例。如 【 Runtime】 类是使用饿汉单例模式创建。
一、饿汉式的两种实现(可以使用)
1、final 静态常量:在类加载时就实例化对象,可以理解为以空间换时间;
2、静态代码块:同静态常量形式,都是在类加载时实例化对象。
不推荐加载类便创建实例,如不使用实例化对象会造成空间的浪费,未达成懒加载。
二、懒汉式(不建议)
1、getInstance方法获取实例对象:虽然实现懒加载,但存在线程安全问题;
2、getInstance方法使用synchronized关键字修饰:实现懒加载也解决了线程安全问题,但是在获取实例化对象时需要排队等待,降低使用效率。
三、双重校验锁(推荐使用)
使用volatile关键字修饰静态变量,防止指令重排序;使用双重判断及代码块synchronized(A.class)解决线程安全问题,实现懒加载,推荐使用。
四、静态内部类(推荐使用)
依据JVM类加载机制实现单例模式,即在加载需要 实例化的类 时,不会直接实例化该类,即不会创建该类的实例化对象,当调用getInstance()方法时,静态内部类被加载并创建该类的实例化对象。
使用静态内部类的加载机制实现了懒加载并解决了线程安全问题,推荐使用。
五、枚举(推荐使用)
根据枚举类的特性实现懒加载及解决线程安全问题,并且可以防止反序列化攻击,推荐使用。
class EnumSingleton{
private EnumSingleton(){}
public static EnumSingleton getInstance(){
return SigEnum.INSTANCE.getInstance();
}
private enum SigEnum{
INSTANCE;
private EnumSingleton instance;
SigEnum(){
instance = new EnumSingleton();
}
private EnumSingleton getInstance() {
return instance;
}
}
}
以上仅代表个人理解,如果有问题欢迎留言讨论。