Singleton 模式和 Double-Checked Locking 模式都比较简单,而且非常常用。它们都用于确保某个类只有一个对象实例化。
两个模式的区别在于:
Singleton 模式用在多线程中,Double-Checked Locking 模式用于多线程应用程序。
Singleton模式:
public class SingletonPattern {
private static SingletonPattern instance;
private SingletonPattern(){} //私有化构造器
public static SingletonPattern getInstance(){ //如果实例存在不为null直接返回,否则实例化
if(instance == null) instance = new SingletonPattern();
return instance;
}
}
Double-Checked Locking 模式:
在多线程中,假设对 getInstance()方法的两个调用几乎同时发生,这种情况可能会导致错误。
1. 第一个线程检查实例是否存在。因为实例不存在,该线程执行创建第一个实例的代码部分。
2. 然而,假设在实例化之前,另一个线程也来检查实例成员变量是否为null。因为第一个线程还什么都没创建,实例成员
变量仍然等于null,所以第二个线程也执行了创建一个对象的代码。
3. 现在,两个线程都执行了Singleton对象的new操作,因此创建了两个对象。
如果Singleton有状态,而且我们希望当一个对象改变其状态时,所有其他对象都看到,那么这就成了一个严重的问题。和第一个线程互操作的对象,与和其他线程互操作的对象都不同。
多线程的单例:利内部类只有在第一次使用时才会被装载
public class SingletonPattern {
private static class Instance{
static final SingletonPattern instance = new SingletonPattern();
}
private SingletonPattern(){}
public static SingletonPattern getInstance(){
return Instance.instance;
}
}