设计模式-单例模式的实现方式

1 单列模式

      单例模式是保证一个类仅只有一个实例,不允许有重复;单例类必须自己创建自己的唯一实例

1.1 单例模式的实现方式

        懒汉式单例模式:在类加载时不初始化。

        饿汉式单例模式:在类加载时就完成了初始化。

    1. 直接实例化(饿汉

public class Singleton {
  //私有化构造
  private Singleton (){}

  //直接产生单例
  private static final Singleton singlton = new Singletion();

  //提供单例的唯一访问入口
  public static Singleton getInstance(){
    return singlton;
  }


}

2.延迟实例化 (懒汉)

public class Singleton{
 
  //私有化构造
  private Singleton(){}

  private static Singleton singleton = null;

  public static Singleton getInstance(){
     if(singlton!=null){
        singleton = new Singleton();
     }
     return singleton;
  }
}
  • 与饿汉模式不同的是单例成员变量singleton 首先初始化null,在getInstance()内部进行延时实例化,返回单例对象,但是该实现方法线程不安全。

2.1  线程安全       

public class Singleton{
 
  //私有化构造
  private Singleton(){}

  private static Singleton singleton = null;

  public static synchronized  Singleton getInstance(){
     if(singlton!=null){
        singleton = new Singleton();
     }
     return singleton;
  }
}

实现了线程安全,getInstance() 方法是同步方法,当多线程访问时程序变为了串行,但是对于程序的运行速度来说,有些代码不需要同步,降低了运行效率。

2.2.1 线程安全(部分代码块同步)

public class Singleton{
 
  //私有化构造
  private Singleton(){}

  private static Singleton singleton = null;

  public static Singleton getInstance(){
     if(singlton!=null){
         synchronized (Singleton.class){
             if(singlton!=null){
                singleton = new Singleton();
             }
         }
        
     }
     return singleton;
  }
}

部分代码块同步,提高了运行效率,使用了双重检验,来获取单例对象。

2.3(静态内部内)

public class Singleton {

  //私有化构造
  private Singleton(){}
  
  //创建私有的静态内部类
  private static class Singleton2{
      private static final Singleton singleton = new Singleton();
  }
  
  public static final Singleton getInstance(){
    return Singleton2.singleton;
  }
  
}
  • 静态内部类最大的不同在于内中没有synchronized关键字,提高了程序的运行速度,他是通过Singleton2来实现单例对象,对象Singleton2.singleton是线程安全的,当程序运行时,单例对象并不是立即加载的,当第一次调用Singleton2.singleton,单例对象才动态生成。因此利用静态内部类的方式是最优的。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值