1.饿汉式单例模式
/** * 饿汉_单例模式 * Created by Administrator on 2016/8/6. */ public class SingMode { private final static SingEHanMode mSingMode = new SingEHanMode(); private SingEHanMode() { } public static SingEHanMode getInstance() { return mSingMode; } }
2.懒汉式单例模式
/** * 懒汉_单例模式 * 优点:单例只有在使用的时候才会初始化,在一定程度上节约了资源 * 缺点:第一次加载时需要及时进行实例化,反应稍慢,最大的问题是->每次getInstance()方法都会进行同步,这样会消耗不必要的资源,造成不必要的同步开销 * * 这种模式一般不建议使用. */ public class SingMode { //1.创建对象 private static SingMode singMode; //2.私有化构造方法 private SingMode(){} //3.创建getInstance()方法 public static synchronized SingMode getInstance(){ if(singMode==null){ singMode = new SingMode(); } return singMode; } }3.双重检索单例模式
/** * 单例的最常用写法(双重检索模式) * 优点:资源利用率高, * 缺点:第一次加载时反应慢 */ public class SingMode { //1.创建私有化对象 private static SingMode singMode = null; //2.构造方法私有化 private SingMode(){} //3.创建getInstance();方法 public static SingMode getInstance(){ if(singMode == null){ synchronized (SingMode.class){ if(singMode==null){ singMode = new SingMode(); } } } return singMode; } }4.静态内部类单例模式
/** * 静态内部类单例模式 * 在<<java 并发编程实践>>一书中推荐这种单例模式 * 该书还指出了不推荐使用双重检索 * 优点:第一次加载的时候不会初始化,只有在调用getInstance()方法的时候才会被初始化, * 第一次调用getInstance()的时候回让JVM加载内部类,不仅能保证线程的安全,也能保证单例对象的唯一性 * 同时也延时了单例的实例化 */ public class SingMode { //1.构造方法私有化 private SingMode() { } //2.创建getInstance()方法 public static SingMode getInstance() { return SingModeHolder.singMode; } //3.静态内部类创建对象 /** * 静态内部类 */ private static class SingModeHolder { private static final SingMode singMode = new SingMode(); } }
虽然以上方法都各有各的好处,但是在反序列化的时候都会出现问题
需要加入如下代码:
/** *防止反序列化的方法 */ private Object readResolve() throws ObjectStreamException{ return SingStaticModeHolder.singStaticMode; }
这个方法也是在书上看见的,也不知道怎么回事,烦请大神赐教!
单例的另类实现
/** * 单例模式管理者 * 在程序的初始,将多个单例模式注入到一个统一的管理类中,在使用的时候根据Key获取对应的对象 */ public class SingModeManager { //1.创建Map集合保存单例 private static Map<String, Object> mSingManager = new HashMap<>(); //2.私有化构造函数 private SingModeManager() { } //3.创建添加和获取的方法 public static void registerService(String key, Object object) { if (!mSingManager.containsKey(key)) { mSingManager.put(key, object); } } public static Object getService(String key) { return mSingManager.get(key); } }
2420

被折叠的 条评论
为什么被折叠?



