线程安全的单例模式实现有几种思路,个人认为第2种方案最优雅:、饿汉式、借助内部类、普通加锁解决、双重检测,但要注意写法,如果单体模式继续扩展为N元单体模式,那就是对象池模式了
1、饿汉式单例
public class Singleton {
private final static Singleton INSTANCE = new Singleton();
private Singleton() { } public static Singleton getInstance() {
return INSTANCE;
}
} 2、借助内部类
属于懒汉式单例,因为Java机制规定,内部类SingletonHolder只有在getInstance()方法第一次调用的时候才会被加载(实现了lazy),而且其加载过程是线程安全的。内部类加载的时候实例化一次instance。 public class Singleton {
private Singleton() { }
private static class SingletonHolder {
private final static Singleton INSTANCE = new Singleton();
} public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
} 3、普通加锁解决 public class Singleton {
private static Singleton instance = null;
private Singleton() { }
public static synchronized Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
} return instance;
}
}
|