Java 单例模式



Java 单例模式

java中单例模式是一种常见的设计模式。
单例模式有一下特点:
1、单例类只能有一个实例。
2、单例类必须自己自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。
[java] view plaincopy在CODE上查看代码片派生到我的代码片
/**
* 单例模式的五种写法:
* 1、懒汉
* 2、恶汉
* 3、静态内部类
* 4、枚举
* 5、双重校验锁
* 2013-12-6
*/
public class Singleton {

/**
*五、 双重校验锁,在当前的内存模型中无效
*/
static class LockSingleton {
private volatile static LockSingleton singleton;

private LockSingleton() {
}

//详见:http://www.ibm.com/developerworks/cn/java/j-dcl.html
public static LockSingleton getInstance() {
if (singleton == null) {
synchronized (LockSingleton.class) {
if (singleton == null) {
singleton = new LockSingleton();
}
}
}
return singleton;
}

}

/**
* 四、枚举,《Effective Java》作者推荐使用的方法,优点:不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象
*/
enum EnumSingleton {
INSTANCE;
public void doSomeThing() {
}
}

/**
* 三、静态内部类 优点:加载时不会初始化静态变量INSTANCE,因为没有主动使用,达到Lazy loading
*/
static class InternalSingleton {
private static class SingletonHolder {
private final static InternalSingleton INSTANCE = new InternalSingleton();
}


private InternalSingleton() {
}

public static InternalSingleton getInstance() {
return SingletonHolder.INSTANCE;
}
}

/**
* 二、恶汉,缺点:没有达到lazy loading的效果
*/
static class HungrySingleton {
private static HungrySingleton singleton = new HungrySingleton();

private HungrySingleton() {
}

public static HungrySingleton getInstance() {
return singleton;
}
}

/**
* 一、懒汉,常用的写法
*/
static class LazySingleton {
private static LazySingleton singleton;

private LazySingleton() {
}

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