《剑指offer》面试题2:实现线程安全的单例模式
推荐的解法(Java实现):
1、使用静态内部类(同时实现序列化接口)。代码如下:
public class Singleton implements Serializable {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
// 对象被反序列化时自动调用(非静态)
private Object readResolve() {
return SingletonHolder.instance;
}
}
其中非静态的readResolve方法是当对象被反序列化时自动调用的方法(如不实现序列化接口,可不写该方法)
2、使用双重检查锁+volatile关键字防止指令重排。代码如下:
public class Singleton {
private static volatile Singleton instance = null;
private Singleton() {}
private static Singleton getInstance() {
if (null == instance) {
synchronized(Singleton.class) {
if (null == instance) {
instance = new Singleton();
}
}
}
return instance;
}
}
以上两种解法是在笔试面试中推荐使用的解法。