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

2019-08-25  本文已影响0人  DASH_1024

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

应用场景

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;
    }
}
上一篇下一篇

猜你喜欢

热点阅读