单例模式及其4种推荐写法和3类保护手段

本文介绍了单例模式及其4种推荐写法(饿汉模式,双重校验锁(DCL),Holder模式(静态内部类)和枚举模式)和3类保护手段(反序列化,反射,自定义类加载器)

单例模式(Singleton Pattern)的定义:

Ensure a class has only one instance,and provide a global point of access to it.
确保某一个类只有一个实例,并且自行实例化并向整个系统提供这个实例.

使用单例模式的优点
  1. 节省内存
  2. 减少性能开销
  3. 避免对资源的多重占用
单例模式的使用场景
  1. 无状态的工具类:比如日志工具类,不管是在哪里使用,我们需要的只是它帮我们记录日志信息,除此之外,并不需要在它的实例对象上存储任何状态,这时候我们就只需要一个实例对象即可。
  2. 全局信息类:比如我们在一个类上记录网站的访问次数,我们不希望有的访问被记录在对象A上,有的却记录在对象B上,这时候我们就让这个类成为单例。
  3. 实例化需要消耗过多资源的类
  4. 要求生成唯一序列化的环境

值得注意的是,单例往往都可以通过直接声明为static来实现,把一个实例方法变成静态方法,或者把一个实例变量变成静态变量,都可以起到单例的效果。这只是面向对象和面向过程的区别。

单例模式的4种推荐写法

这里列举了单例模式的4种安全的推荐写法,另外也可以直接在获取单例的方法上加synchronized,这种方法虽然安全但效率极低,不值得推荐.这里4种推荐写法分别为饿汉模式,双重校验锁(DCL),Holder模式(静态内部类)枚举模式.

1. 饿汉模式
public class Singleton {
   
    private final static Singleton INSTANCE= new Singleton ();
    private Singleton () {
   
    }
    public static Singleton getInstance() {
     
	    return INSTANCE;  
    }  
}
  1. 原理:通过类加载机制来保证单例,在类被加载的时候创建INSTANCE对象
  2. 优点:较简单
  3. 缺点:导致类装载的原因有很多种,在单例模式中大多数都是调用getInstance方法, 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化instance显然没有达到lazy loading的效果。
2.双重校验锁(DCL)
public class Singleton {
   
   private volatile static Singleton instance = null;

   private Singleton () {
   
   }

   public static Singleton getInstance() {
   
       if(instance == null) {
   
           synchronized(Singleton.class) {
   
               if(instance == null) {
   
                   instance = new Singleton
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值