Spring 中 bean 的默认作用域就是 singleton(单例) 的 <!-- more --> ## 场景 1. **节省系统资源**,空间和时间 2. **提供全局访问点**:单例模式提供了一个易于访问的全局接口,其他对象可以通过这个接口访问单例类的实例,无需自行管理其生命周期和状态。 ## 如何实现单例 ### 饿汉式 1、私有化构造方法 2、双重校验防止加锁过程中状态发生变化 3、加 volatile 防止重排序导致的假 singleton ### 枚举实现单例模式 枚举 1: 想通过枚举的反射拿构造函数会抛 IllegalArgumentException 枚举 2: 被反序列化时,不会通过调用构造函数来创建新的实例。相反,反序列化方法会返回已经存在的 enum 常量,这确保了 enum 的单例性。 ## 如何破坏单例 反射和反序列化都会破坏单例模式,相当于绕开了 Java 提供的常规的 new 一个对象,用构造方法的机制