什么是单例模式?
单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点。通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象,一个
最好的办法是,让类自身负责保存它的唯一实例。这个类可以保证没有其它实例可以被创建,并且它可以提供一个访问该实例的方法。
单例模式解决了什么问题?
1.全局访问:外界不能通过new来实例化该变量,但是我们又要提供一个方法使得外界可以得到该实例;
2.实例化控制:实例化仅由该类自己控制,而不需要调用这个类的那部分控制;
简单来说就是对唯一实例的受控访问。
饿汉模式
public class Singleton {
private Singleton(){
}
private static final Singleton instance = new Singleton();
public static Singleton getInstance(){
return instance;
}
}
懒汉模式
public class Singleton {
private Singleton(){
}
private static Singleton instance = null;
public synchronized static Singleton getInstance(){
if(instance == null)
instance = new Singleton();
return instance;
}
}
双重锁定(Double-Check Locking)
public class Singleton {
private Singleton(){
}
private static Singleton instance = null;
public static Singleton getInstance(){
if(instance == null){
synchronized (Singleton.class) {
if(instance == null)
instance = new Singleton();
}
}
return instance;
}
}
当两个线程同时进入getInstance时,如果instance为null,那么由于锁机制,两个线程只有一个进入,另一个在外边排队等候,必须其中一个进入并出来后,另一个才能进入。
如果没有第二层的判断,那么最后就会创建两个实例。