java设计模式之单例模式(Singleton)

原创 2019-07-30 10:01:51 设计模式 阅读(238)

简介 单例对象是一种常用的设计模式,在java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。

单例模式的好处:

  1. 某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。
  2. 省去了new操作符,降低了系统内存的试用频率,减轻GC压力。
  3. 有些类,如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。所以只有试用单例模式,才能保证核心交易服务器独立控制整个流程。
  • 简单的单例类(懒汉式)
public class Singleton{ // 私有静态实例,防止被应用,赋值null,为了实现延迟加载 private static Singleton instance = null; //私有构造方法 private Singleton(){} //静态方法,创建实例 public static Singleton getInstance(){ if(instance == null){ instance = new Singleton(); } returen instance; } //如果该对象被用于序列号,可以保证对象在序列号前后保持一致 public Object readResolve(){ return instance; } }
  • 双重检查锁定单例
    这个简单的单例类可以满足基本要求,但是在多线程环境下却不适用,需要给getInstance方法加上同步synchronized关键字,而给方法加锁无疑会锁住对象,这样对性能有所降低,所需给代码块加锁会提高同步性能:
public static Singleton getInstance(){ if(instance == null){ synchronized (instance){ if(instance == null) instance = new Singleton(); } } return instance; }

双重检查模式下,通常会给私有变量instance加入volatile关键字来创建单例,来保证可见性和禁止指令重排序:

//volatile保证可见性和禁止指令重排序 private volatile static Singleton instance = null;
  • 静态内部类单例模式
    试用静态内部类方式,既能保证线程安全,又能保证单例,且它只有在调用getInstance方法时虚拟机加载SingletonHolder并初始化Singleton
public class Singleton { private Singleton(){} public static Singleton getInstance(){ return SingletonHolder.sInstance; } private static class SingletonHolder { private static final Singleton sInstance = new Singleton(); } }
  • 枚举单例
    枚举创建的单例也是线程安全的,枚举单例代码最简洁
public enum Singleton{ INSTANCE; public void doSomeThing(){ //... } }