设计模式–单例模式
-
定义: 确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。
-
应用场景:
需要频繁创建的一些类,使用单例可以降低系统的内存压力,减少GC
某些类创建实例时占用资源较多,或实例化耗时较长,且经常使用。
频繁访问数据库或文件的对象
-
要点:
私有化构造器
保证线程安全
延迟加载
防止序列化和反序列化破坏
防御反射攻击
饿汉式
// 容器启动时创建,私有化构造方法,提供全局访问点getInstance,
public class HungrySingleton {
// 容器启动时创建
private static HungrySingleton instance = new HungrySingleton();
// 私有化构造方法
private HungrySingleton() {}
// 全局访问点
public HungrySingleton getInstance() {
return instance;
}
}
懒汉式-双重检查锁+volatile
public class LazySingleton {
// 懒加载, volatile防止指令重排序
private static volatile LazySingleton instance;
// 私有化构造方法
private LazySingleton() { }
public LazySingleton getInstance() {
if (instance != null) {
synchronized(instance) {
if (instance != null) {
instance = new LazySingleton();
}
}
}
return instance;
}
}
内部类
// 利用了类加载的机制
public class InnerClassSingleton {
// 内部类
private class InnerClassSingletonHolder {
private static InnerClassSingleton instance = new InnerClassSingleton();
}
// 私有化构造方法
public InnerClassSingleton() {}
// 全局访问点
public InnerClassSingleton getInstance() {
return InnerClassSingletonHolder.instance;
}
}