单例模式
单例模式:
why?
创建对象的时间、内存消耗、GC及停顿时间
恶汉式:(缺点是实例创建没法延迟加载)
public class Singleton {
private Singleton() {
}
private static Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
}懒汉式:(缺点:多线程下性能问题)
public class LazySingleton {
private LazySingleton() {
}
private static LazySingleton instance = null;
public static synchronized LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}双检锁:(多线程下不能确保安全,原因在于JMM内存模型,初始化对象和指针指向内存空间存在重排序优化问题。使用volatile修饰即可)
public class DoubleCheckedLocking {
private static DoubleCheckedLocking instance;
private DoubleCheckedLocking() {
}
public static DoubleCheckedLocking getInstance() {
if (instance == null) {
synchronized (DoubleCheckedLocking.class) {
if (instance == null)
instance = new DoubleCheckedLocking();
}
}
return instance;
}
}public class SafeDoubleCheckedLocking {
private volatile static SafeDoubleCheckedLocking instance;
private SafeDoubleCheckedLocking() {
}
public static SafeDoubleCheckedLocking getInstance() {
if (instance == null) {
synchronized (SafeDoubleCheckedLocking.class) {
if (instance == null)
instance = new SafeDoubleCheckedLocking();
}
}
return instance;
}
}静态内部类方式:(由JVM的类加载保证多线程安全性)
public class InnerClassMode {
private static class InstanceHolder {
public static InnerClassMode instance = new InnerClassMode();
}
private InnerClassMode() {
}
public static InnerClassMode getInstance() {
return InstanceHolder.instance;
}
}上面这些方式在极端的情况下,比如反射和序列化反序列化时,仍可能出现多例。反序列化可以给对象定义readResolve()方法总是返回唯一实例来防止。

浙公网安备 33010602011771号