https://juejin.cn/post/7325069743143157801

单例模式旨在确保一个类只有一个实例,并提供一个全局访问点。然而,有几种方法可以破坏单例模式:

破坏方式:

  1. 反射:通过反射的方式可以访问私有构造函数,从而创建额外的实例。
  2. 序列化与反序列化:如果单例实现了 Serializable 接口,那么反序列时可能会创建一个新的实例。
  3. 多线程:在多线程环境下,如果没有正确实现单例,可能会创建多个实例。
  4. 克隆:如果单例类实现了 Cloneable 接口,通过克隆方法可以创建额外的实例。
  5. 类加载器:不同的类加载器可以加载同一个类的多个实例。如果单例类被不同的类加载器加载,那么每个类加载器都会创建一个单例实例。

预防措施:

  1. 防止反射破坏
public class Singleton {
	private static final Singleton INSTANCE = new Singleton();
	
	 private Singleton() {
		 if (INSTANCE != null) {
			 throw new IllegalStateException("Instance already created!");
		 }
	 }
	 
	 public static Singleton getInstance() {
        return INSTANCE;
    }
}
  1. 防止序列化破坏