第一周:单例模式

2018-08-21  本文已影响15人  xlesterx

单例模式,保证一个类仅有一个示例,并提供一个访问它的全局访问点。

单例模式实现方式:

  1. 懒汉模式: 后初始化
  2. 饿汉模式: 先初始化 instance = new Singleton();
  3. 静态内部类 以上都不防反射

1. 懒汉 双重锁版

思路:

volidate 内存屏障 讲解:
新建对象 new Object()
情况1:
    1:分配对象的内存空间
    2:初始化对象  -> instance != null
    3:设置instance指向刚分配的内存地址
结果:另外一条线程获取了对象,但空数据
情况2:
    1:分配对象的内存空间
    3:设置instance指向刚分配的内存地址  instance = null
    2:初始化对象  -> instance != null
结果:另外一条线程覆盖了原来的线程数据

实现代码

public class Singleton {
    private Singleton() {
        // 私有构造方法
    }
    private volatile static Singleton instance = null;

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance ==null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

2. 静态内部类模式

思路:

public class InnerSingleton {
    private static class LazyHolder {
        private static final InnerSingleton INSTANCE = new InnerSingleton();
    }
    private InnerSingleton() {}
    public static InnerSingleton getInstance() {
        return LazyHolder.INSTANCE;
    }
}

应用场景

  1. 需要频繁实例化然后销毁的对象。
  2. 创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
  3. 有状态的工具类对象。
  4. 频繁访问数据库或文件的对象。
  5. 共享资源(线程池等)
上一篇 下一篇

猜你喜欢

热点阅读