Java 面试题
目录

Java 中什么是单例模式?

· 约 5 分钟读完 · 第 150 / 274 章

推荐答案

在 Java 中,单例模式(Singleton Pattern)是一种设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来获取该实例。单例模式通常用于控制资源的访问,例如数据库连接、线程池等。

实现方式

  1. 饿汉式单例:在类加载时就创建实例,线程安全。
  2. 懒汉式单例:在第一次使用时才创建实例,需要考虑线程安全问题。
  3. 双重检查锁定:结合了懒汉式和线程安全的优点。
  4. 静态内部类:利用类加载机制保证线程安全,同时实现懒加载。
  5. 枚举单例:通过枚举类型实现单例,简洁且线程安全。

示例代码

本题详细解读

单例模式的核心思想

单例模式的核心思想是确保一个类只有一个实例,并且提供一个全局访问点。这种模式通常用于需要严格控制资源访问的场景,例如数据库连接、线程池、日志记录器等。

单例模式的优缺点

优点

  1. 控制资源访问:单例模式可以确保只有一个实例存在,从而避免资源冲突。
  2. 节省内存:由于只有一个实例存在,可以减少内存开销。
  3. 全局访问点:单例模式提供了一个全局访问点,方便其他对象访问该实例。

缺点

  1. 扩展性差:单例模式通常难以扩展,因为它的实例是唯一的。
  2. 测试困难:由于单例模式的全局性,测试时可能会遇到困难。
  3. 违反单一职责原则:单例模式通常承担了过多的职责,可能会违反单一职责原则。

单例模式的应用场景

  1. 数据库连接池:确保只有一个连接池实例存在,避免资源浪费。
  2. 日志记录器:确保日志记录器只有一个实例,避免日志冲突。
  3. 配置管理器:确保配置管理器只有一个实例,避免配置冲突。
  4. 线程池:确保线程池只有一个实例,避免线程资源浪费。

单例模式的实现方式比较

  1. 饿汉式:简单且线程安全,但可能会造成资源浪费。
  2. 懒汉式:延迟加载,但需要考虑线程安全问题。
  3. 双重检查锁定:结合了懒汉式和线程安全的优点,但实现较为复杂。
  4. 静态内部类:利用类加载机制保证线程安全,同时实现懒加载,推荐使用。
  5. 枚举单例:简洁且线程安全,推荐使用。

单例模式的注意事项

  1. 线程安全:在多线程环境下,需要考虑单例模式的线程安全问题。
  2. 序列化:如果单例类实现了 Serializable 接口,需要防止反序列化时创建新的实例。
  3. 反射攻击:通过反射可以绕过私有构造函数创建新的实例,需要采取措施防止这种情况。

通过以上分析,我们可以更好地理解单例模式在 Java 中的应用及其实现方式。