单例(Singleton)是指只实例化一次的类。
一、如何实现单例
单例类常用的实现方式有以下几种
1、饿汉式:类载入时创建单例实例
1.1、公开的静态常量单例对象
/**
* *
* <p>
* *
* <h6>当类StaticFinalSingleton类被实例化时,有且仅有一个StaticFinalSingleton实例存在 *
* (除非客户端通过类反射机制调用该私有的构造方法,否则外部无法改变单例)</h6> * * @Copyright 2011 *
* </p>
*/
public class StaticFinalSingleton {
/** * 公有静态常量单例对象 */
public static final StaticFinalSingleton INSTANCE = new StaticFinalSingleton();
/** * 私有构造方法 */
private StaticFinalSingleton() {
}
}
1.2、静态工厂方法获取私有静态常量单例对象
/**
* *
* <p>
* *
* <h6>当类StaticFinalSingleton类被实例化时,有且仅有一个StaticFinalSingleton实例存在 *
* (除非客户端通过类反射机制调用该私有的构造方法,否则外部无法改变单例)</h6> * * @Copyright 2011 *
* </p>
*/
public class StaticFinalSingleton {
/** * 私有静态常量单例对象 */
private static final StaticFinalSingleton INSTANCE = new StaticFinalSingleton();
/** * 私有构造方法 */
private StaticFinalSingleton() {
}
/** * 静态工厂方法获取StaticFinalSingleton型的私有静态常量单例对象 */
public static StaticFinalSingleton getInstanceFactory() {
return INSTANCE;
}
}
2、懒汉式:延迟加载创建单例实例
2.1、基于静态同步锁的lazy initialization单例类
此种方法不常用,因为在实际中会大大影响并发度,性能较差
/**
* <p>
* <h6>基于静态同步锁的lazy initialization单例类:<br>
* 此种方法不常用,因为在实际中会大大影响并发度,并且可能不够安全</h6>
*
* @Copyright 2011
* </p>
*/
public class SynLockSingleton {
/**
* 私有静态常量单例对象
*/
private static SynLockSingleton INSTANCE = null;
/**
* 私有构造方法
*/
private SynLockSingleton() {
}
/**
* 返回单例实例
*/
public static synchronized SynLockSingleton getInstanceFactory() {
if (INSTANCE == null) {
INSTANCE = new SynLockSingleton();
}
return INSTANCE;
}
}
2.2、基于双检查锁机制的lazy initialization单例类
双检查锁只有在 jdk 1.5 及以上版本才能达到单例的效果,因此不常用
/**
* <p>
* <h6>基于双检查锁机制的lazy initialization单例类:<br>
* 双检查锁只有在 jdk 1.5 及以上版本才能达到单例的效果,因此不常用</h6>
*
* @Copyright 2011
* </p>
*/
public class DCLSingleton {
private static DCLSingleton INSTANCE = null;
/**
* 私有构造方法
*/
private DCLSingleton() {
}
/**
* 返回单例实例
*/
public static DCLSingleton getInstance() {
if (INSTANCE == null) {
synchronized (DCLSingleton.class) {
if (INSTANCE == null) {
INSTANCE =