单例模式

单例模式:
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()方法总是返回唯一实例来防止。



posted @ 2014-04-12 19:41  慕 名  阅读(183)  评论(0)    收藏  举报