单例模式,保证一个类仅有一个示例,并提供一个访问它的全局访问点。
单例模式实现方式:
- 懒汉模式: 后初始化
- 饿汉模式: 先初始化 instance = new Singleton();
- 静态内部类 以上都不防反射
1. 懒汉 双重锁版
思路:
- 私有构造方法
- 单例对象
- 静态工厂方法 到此非线程安全
- 双重锁 -> synchronized + 判断
- volidate 内存屏障
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;
}
}
应用场景
- 需要频繁实例化然后销毁的对象。
- 创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
- 有状态的工具类对象。
- 频繁访问数据库或文件的对象。
- 共享资源(线程池等)
网友评论