单例模式的定义 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 好了。说了这么多似懂非懂,贫道也腻歪,下面我们来说点实际的吧,单例模式一般会有哪些关键点呢?容贫道一一道来 1、构造函数不对外开放,一般为Private 2、通过一个静态方法或者枚举返回单例类对象 3、确保单例类的对象有且只有一个,尤其是多线程的环境下 4、确保单例对象在反序列化时不会重新构建对象
单例模式的实践 3.1.说了这么多有的没的,下面就来撸一把。分别介绍有几种实现单例模式的方法。 3.11.懒汉模式
public class Singleton { /*懒汉模式*/ private static Singleton instance; private Singleton(){} private static synchronized Singleton getInstance(){ if (instance == null ){ instance = new Singleton(); } return instance; } 好了,我们现在实现了最简单的单例。我们在getInstance()方法中添加了synchronized关键字,也就是说这个方法是个同步方法,所以这就上面所说的特点满足确保单例类的对象有且只有一个,尤其是多线程的环境下,但是我们细细的来一下啊,我们会发现一个问题,即使instance已经被初始化(第一次调用会进行初始化instance)每次调用getInstance都会进行同步,这样就会消耗不必要的资源,这也是这种模式存在的最大问题。所以呀一般也不建议使用。 3.1.2. Double cHECK lOCK(DCL)模式 public class Singleton { /*DCL模式*/ private volatile static Singleton instance = null; private Singleton() { } private static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } } DCL的优点:资源利用率高,第一次执行getInstance时单例对象才会被实例化,效率高,缺点为第一次加载时反应稍微慢点,DCL时是使用最多的单例模式实现,他可以在需要的时候才实例化。并且大多数的情况下能保证单例对象的唯一性。 3.1.3 静态内部类单例模式 Created by liwenjie on 2017/5/5. */public class Singleton { /静态内部类模式/ private Singleton() { } public static Singleton getInstance(){ return SingletonHolder.mSingleton; }
/*静态内部类*/ private static class SingletonHolder{ private static final Singleton mSingleton =new Singleton(); }} “` 这种方式当第一次加载的时候并不会初始化mSingleton ,只有在第一次调用getInstance时候才会导致mSingleton 初始化,这种方式不仅能保证线程安全,也能保证单例对象的唯一性。同时也延迟了单例的实例化,这我比较推荐这种方式。
好了~~单例就介绍到这吧。。贫道老老实实的去搬砖了。
南无阿弥陀佛。善哉善哉~