线程安全的单例模式实现方式有四种:饿汉式、静态内部类、枚举、双重检查
1、饿汉
特点:类初始化的时候就实例化,没有lazy loading效果。
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
2、静态内部类
特点:外部类初始化的时候,内部类可以不初始化,达到lazy loading效果。
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
3、枚举
特点:自由序列化、保证只有一个实例(即使使用反射机制也无法多次实例化一个枚举量)。
class Resource{}
public enum Singleton {
INSTANCE; //这就是Sington的实例
private Resource instance;
Singleton() {
instance = new Resource();
}
public Resource getSingleton() {
return instance;
}
public static void main(String[] args){
Resource instance=Singleton.INSTANCE.getSingleton();
}
}
4、双重检验锁
特点:可实现延迟加载,同时提高了以synchronized同步方法的懒汉式单例模式的访问性能。
public class Singleton {
private volatile static Singleton singleton; //volatile能保证顺序性,防止被重排序
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
参考文章:http://www.infoq.com/cn/articles/double-checked-locking-with-delay-initialization