【个人记录】单例模式的几种实现及优缺点


单例模式使用场景:项目需要频繁的进行对象的创建和销毁,为了节省系统资源,推荐使用单例模式。即防止使用者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;
        }
     }
}

以上仅代表个人理解,如果有问题欢迎留言讨论。

猜你喜欢

转载自blog.csdn.net/ykx____h/article/details/114836877