单例模式(Singleton)
定义
保证一个类仅有一个实例,并提供一个全局访问点。
使用场景
当你希望整个系统运行期间某个类只有一个实例时候
示例代码
双重检查
java
public class Singleton1 {
private Singleton1() { }
private static volatile Singleton1 instance;
public static Singleton1 getInstance() {
// 第一重检查 为了提高性能
if (instance == null) {
synchronized (Singleton1.class){
// 第二重检查 保证线程安全
if (instance == null) {
instance = new Singleton1();
}
}
}
return instance;
}
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
Singleton1 instance1 = Singleton1.getInstance();
System.out.println("instance1 = " + instance1);
// 通过反序列化破坏
Singleton1 instance2 = JSON.parseObject(JSON.toJSONString(instance1), Singleton1.class);
System.out.println("instance2 = " + instance2);
// 通过反射破坏
Constructor<Singleton1> constructor = Singleton1.class.getDeclaredConstructor();
constructor.setAccessible(true);
Singleton1 instance3 = constructor.newInstance();
System.out.println("instance3 = " + instance3);
}
}
静态内部类
java
public class Singleton5 {
private Singleton5() { }
private static class SingletonInstance {
private final static Singleton5 INSTANCE = new Singleton5();
}
public static Singleton5 getInstance() {
return SingletonInstance.INSTANCE;
}
}
静态内部类只有在加载的时候才会加载,且加载一次
枚举
java
public enum Singleton6 {
INSTANCE;
}
除枚举外其他的都可以通过反射和反序列化破坏掉