基本的单例模式实现方式
public class Singleton {
private Singleton () {
System.out.println("Singleton is created");
}
private static Singleton instance = new Singleton();
public static Singleton getInstance () {
return instance;
}
}
但是不足之处是,Singleton的创建时间不受控制。对于静态成员instance, 它会在类第一次初始化的时候被创建,但这个时刻并不一定是getInstance()方法第一次被调用的时候。例如:
public class Singleton {
public static int STATUS = 1;
private Singleton () {
System.out.println("Singleton is created");
}
private static Singleton instance = new Singleton();
public static Singleton getInstance () {
return instance;
}
}
注意这里的单例包含一个静态成员STATUS, 此时在任意地方引用这个STATUS都会导致Singleton这个类被初始化,并创建instance实例。
延迟加载的单例模式实现方式
public class LazySingleton {
private LazySingleton() {
System.out.println("Singleton is created");
}
private static LazySingleton instance = null;
public static synchronized LazySingleton getInstance() {
if (instance == null)
instance = new LazySingleton();
return instance;
}
}
这样在调用getInstance()方法的时候才会创建单例对象。但是坏处是在并发环境下加锁,会对性能产生影响。
结合两种单例模式的实现方式
public class StaticSingleton {
private StaticSingleton() {
System.out.println("Singleton is created");
}
private static class SingletonHolder {
private static StaticSingleton instance = new StaticSingleton();
}
public static StaticSingleton getInstance() {
return SingletonHolder.instance;
}
}
这种方式没有加锁,在并发模式下性能优越,而且只有在getInstance()方法被第一次调用时,StaticSingleton实例才会被创建。
《Java高并发程序设计》第5章 · 并行模式与算法