设计模式之单例模式四(饿汉式)

前面讲了懒汉式的单例模式,所谓懒汉式就是延迟加载,什么时候需要什么时候构造。前面的博客中讲了两种实现方法。第一种懒汉式的实现是在getInstance中直接new一个单例对象,这种实现方法就得自己考虑线程安全而加锁,具体加锁的实现也讲了两种方法,一种是基于同步方法;另一种是采用double check的方法。第二种懒汉式的实现是采用私有静态内部类的方式进行延迟加载,让单例对象在内部类的初始化阶段进行构造,而引发内部类初始化的语句则在getInstance方法中,这与第一种方式有异曲同工之妙,不过由于有初始刷锁的存在,不用人为的加锁保证线程安全,系统会保证类的初始化只执行一次。

下面讲的恶汉式的单例模式在很多地方说的是使单例对象的构造发生在类的加载阶段,其实我不这么认为,准确来说应该发生在类的初始化阶段。一般恶汉式加载所导致的弊端是可能我并不想使用实例但是实例已经被构造,相对于懒汉式的用则构造会造成内存的浪费,但是其实现方式很简单,不用人为加锁保证线程安全。

说到这里有人可能会提出疑问,恶汉式的单例对象的构造在类的初始化阶段,而采用私有静态内部类的懒汉式单例对象实质也在内部类的初始化阶段构造,为什么后者能起到延迟加载呢?关键在于私有内部类,该类在外部是不可见的,也就说在外部不能通过new、使用内部类的静态方法、使用内部类的静态变量导致内部类的初始化的执行,从另一个方面来说只要保证内部类的初始化只在getInstance方法中被触发,那么就不会提前构造单例对象。而直接恶汉式的方式,很容易在外部对其触发初始化,在触发初始化时还并不想使用单例对象,但是此时单例对象已经被创建,这样就会造成浪费。下面是一种恶汉式的具体实现:

上面对静态成员的初始化也可以写在静态初始化块中,效果是一样的。初始化时构造单例对象,但是此初始化并不一定是getInstance方法触发,可能更早会被触发。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值