美文网首页
单例模式的应用及简单实现

单例模式的应用及简单实现

作者: DASH_1024 | 来源:发表于2019-08-25 23:06 被阅读0次

单例(Singleton)模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点。在实际开发过程中,我们常常需要保存一些数据实现全局共享,这时候就需要用到单例模式。单例模式是在实际开发过程中使用比较多的一种设计模式。

应用场景

  • 需要生成唯一序列的环境
  • 需要频繁实例化然后销毁的对象
  • 创建对象时耗时过多或者耗资源过多,但又经常用到的对象
  • 方便资源相互通信的环境
    对于一些应用程序的日志应用,或者web开发中读取配置文件都适合使用单例模式,如HttpApplication 就是单例的典型应用。而在Android应用开发中,常常需要继承系统Application实现自定义的MyApplication功能,这个也是典型的单例模式应用。

Java中的几种实现方式

1.饿汉式
其主要特点是:线程安全,调用效率高,但是不能延时加载

public class SingleInstance { 
     private static SingleInstance instance = new SingleInstance(); 

     private SingleInstance(){} 

     public static SingleInstancegetInstance(){  
          return instance;  
      } 
}

这种开始把单例对象创建出来了,要用的时候直接返回即可,这种可以说是单例模式中最简单的一种实现方式。但这种方式启动时即创建实例,启动慢,有可能造成资源浪费。

2.懒汉式-线程安全
主要特点:线程安全,调用效率不高,但是能延时加载

public class SingleInstance {
     
    //类初始化时,不初始化这个对象(延时加载,真正用的时候再创建)
    private static SingleInstanceinstance;
     
    //构造器私有化
    private SingleInstance(){}
     
    //方法同步,调用效率低
    public static synchronized SingleInstancegetInstance(){
        if(instance == null){
            instance = new SingleInstance();
        }
        return instance;
    }
}

3.懒汉式-非线程安全
主要特点:懒加载启动快,资源占用小,使用时才实例化,无锁,但其为非线程安全

public class Singleton {
  private static Singleton singleton = null;

  private Singleton() {
  }

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

4.双重锁机制
主要特点:懒加载,线程安全。

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();
                }
            }
        }
        return instance;
    }
}

5.Holder模式
主要特点:将懒加载和线程安全完美结合的一种方式,无锁,推荐这种写法。

public class Singleton {
    /**
     * 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例
     * 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载
     */
    private static class SingletonHolder{
        /**
         * 静态初始化器,由JVM来保证线程安全
         */
        private static Singleton instance = new Singleton();
    }

    /**
     * 私有化构造方法
     */
    private Singleton(){
    }

    public static  Singleton getInstance(){
        return SingletonHolder.instance;
    }
}

相关文章

网友评论

      本文标题:单例模式的应用及简单实现

      本文链接:https://www.haomeiwen.com/subject/oqflectx.html