单例模式,确保一个类只有一个实例。可以延迟实例化。
经典单例模式实现:
public class Singleton{
private Singleton(){}
private static Singleton instance = null;
public static Singleton getInstance(){
if(instance == null)instance = new Singleton();
return instance;
}
}
在多线程环境时,
public static Singleton getInstance(){
if(instance == null)instance = new Singleton();
//若两个线程同时进行判断,则会创建两个对象
return instance;
}
我们发现当多线程同时获取该类实例时,依然会产生多个对象,故我们让这个方法变为同步方法:
public static synchronized Singleton getInstance(){
if(instance == null)instance = new Singleton();
return instance;
}
但同步会降低性能,只有当我们第一次创建这个类的实例时,才需要同步。我们可以不延迟实例化:
private static Singleton instance = new Singleton();
另一种方法,双重加锁:
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;
}
}