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


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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值