确保一个类只有一个实例,并提供一个全局访问点。
多线程解决方案:
1)把getInstance( )变成同步(synchronized)方法,多线程灾难几乎就可以轻易解决了。
缺点:每次用该方法都要同步,会降低拖垮程序的性能。同步一个方法可能会造成程序执行效率下降100倍。
public Singleton{
private static Sigleton uniqueInstance;
// 构造器是私有的,只有类内部方法才能创建类
private Singleton() { }
// 通过增加synchronized关键字,会迫使每个线程在进入这个
// 方法之前,要先等候别的线程离开该方法。
// 也就是说,不会有两个线程可以同时进入这个方法
public static synchronized Singleton getInstance(){
if(uniqueInstance == null){ // 只有是null的才创建对象
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
2)急切实例化
public Singleton{
// 在静态初始化器(static initializer)中创建单件
// 保证了线程安全(thread safe)
private static Sigleton uniqueInstance = new Singleton();
// 构造器是私有的,只有类内部方法才能创建类
private Singleton() { }
public static synchronized Singleton getInstance(){
return uniqueInstance;
}
}
3)用“双重检查加锁”,在getInstance()中减少使用同步。利用“双重检查加锁”(double-checked locking),首先检查实例是否已经创建了,如果尚未创建,“才”进行同步。
这样,只有第一次会同步,之后再也不会了
public Singleton{
// 注意这里加了volatile关键字
// volatile关键字确保:当uniqueInstance变量被初始化成Singleton实例时
// 多个线程正确地处理uniqueInstance变量
private static volatile Sigleton uniqueInstance;
private Singleton() { }
public static synchronized Singleton getInstance() {
if(uniqueInstance == null) {
synchronized (Singleton.class) {
if(uniqueInstance == null){
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
【设计模式】学习笔记7:单件模式(Singleton)
http://blog.csdn.net/shuangde800/article/details/9845317
设计模式(二)单件模式Singleton(创建型)
http://blog.csdn.net/hguisu/article/details/7515416