来源《大话设计模式》
设计模式之单例模式(Singleton):
保证一个类仅有一个实例,并提供一个访问它的全局访问点
源代码,实现多线程时加锁
class Singleton{
private static Singleton instance;
private static Object sysRoot = new Object();
//私有的构造函数
private Singleton(){}
public static Singleton getInstance(){
//双重加锁
if(instance == null){
synchronized (sysRoot) {
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
为什么双重加锁?
对于instance存在的情况直接返回没有问题;当instance为null,并且同时两个线程调用getInstance()方法时,他们可以通过第一重加锁,然后由于sychronized,这两个线程只能进入一个,另一个在外边排队等候,必须要其中一个进去出来后,另一个才可以进入。而此时如果没有了第二重加锁,则第一个线程创建了实例,而第二个还是可以继续创建新的实例,就没有达到单例的目的。