单例模式的7种方式

  • 饿汉模式
    不管三七二十一,不管是否需要,直接实例化出来,可能根本就不需要这个对象,但还是实例化出来了,造成资源浪费,没有懒加载。
class Single{
    private static Single instance=new Single();
    private Single(){

    }

    public static Single getInstance(){
        return instance;
    }
}
  • 懒汉模式(单线程版)
    在多线程下不安全,问题出现在if(instance==null),可能有的线程已经实例化了,但同一时间的别的线程并不知道。
class Single{
    private static Single instance;
    private Single(){

    }

    public static Single getInstance(){
        if(instance==null){
            instance=new Single();
        }
        return instance;
    }
}
  • 懒汉模式(多线程版)
    等需要的时候再加载,但是效率比较低,每次都有多个线程去竞争同一把锁,只有一个线程能拿到锁,就算已经实例出来了也会重复上面的步骤。
class Single{
    private static Single instance;
    private Single(){

    }

    public static Single getInstance(){
        synchronized(Single.class){
            if(instance==null){
                instance=new Single();
            }
        }
        return instance;
    }
}
  • 双重校验锁(DCL)
    volatile修饰成员变量,保证可见性,私有构造方法,第一次校验是为了提高效率,第二次校验是保证返回的是同一个对象。
class Single{
    private static volatile Single instance;
    private Single(){

    }

    public static Single getInstance(){
        if(instance==null){
            synchronized(Single.class){
                if(instance==null){
                    instance=new Single();
                }
            }
        }
        return instance;
    }
}
  • 静态内部类
    采用了类加载的机制保证安全,而且效率也很高。
class Single{
   
   public Single(){

   }

   public static Single getInstance(){
       return InnerInstance.instance;
   }

   private static class InnerInstance {
       private static Single instance=new Single();
   }
}
  • 静态代码块
class Single{
    private static Single instance;
   public Single(){

   }

   static{
       instance=new Single();
   }
   
   public static Single getInstance(){
       return instance;
   }

}
  • 枚举类
class Single{
    private Single(){

    }

    public static Single getInstance(){
        return EnumSingle.INSTANCE.getInstance();
    }

    private enum EnumSingle{
        INSTANCE;
        private  Single instance;
        private EnumSingle(){
            instance=new Single();
        }

        private Single getInstance(){
            return instance;
        }

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值