当前位置: 技术文章>> 100道Java面试题之-什么是Java中的单例模式?请实现一个懒汉式和饿汉式的单例模式。

文章标题:100道Java面试题之-什么是Java中的单例模式?请实现一个懒汉式和饿汉式的单例模式。
  • 文章分类: 后端
  • 3370 阅读
### 什么是Java中的单例模式? 单例模式(Singleton Pattern)是一种常用的软件设计模式,它确保一个类仅有一个实例,并提供一个全局访问点来获取该实例。单例模式的主要目的是控制资源的使用,确保资源被全局唯一访问。 ### 懒汉式单例模式 懒汉式单例模式在第一次被使用时才实例化对象,因此实现了延迟加载。但需要注意的是,在多线程环境下可能会产生多个实例,因此通常需要通过加锁来确保线程安全。 ```java public class LazySingleton { // 私有静态变量,类内部初始化,默认值为null private static LazySingleton instance = null; // 私有构造方法,防止外部通过new创建对象 private LazySingleton() {} // 提供一个全局的静态方法,返回唯一实例,使用synchronized关键字保证线程安全 public static synchronized LazySingleton getInstance() { if (instance == null) { instance = new LazySingleton(); } return instance; } } ``` ### 饿汉式单例模式 饿汉式单例模式在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快。它是线程安全的,因为JVM在加载类时只会创建一次instance实例。 ```java public class HungrySingleton { // 私有静态变量,类内部初始化 private static final HungrySingleton instance = new HungrySingleton(); // 私有构造方法,防止外部通过new创建对象 private HungrySingleton() {} // 提供一个全局的静态方法,返回唯一实例 public static HungrySingleton getInstance() { return instance; } } ``` ### 注意点 - **线程安全**:懒汉式单例模式在多线程环境下需要加锁来确保线程安全,但加锁会影响性能。而饿汉式单例模式则是线程安全的,因为JVM保证了类加载的唯一性。 - **性能问题**:饿汉式单例模式在类加载时就完成了初始化,如果单例对象很大或者初始化很复杂,那么会影响应用的启动性能。而懒汉式单例模式则实现了延迟加载,但是加锁操作会影响性能。 - **双重检查锁定(Double-Checked Locking)**:是一种优化懒汉式单例模式的方法,通过在instance变量上加上volatile关键字来禁止指令重排序,并通过双重检查来减少锁的开销,但实现起来相对复杂。 ### 总结 单例模式是一种常见的设计模式,用于控制资源的使用,确保全局只有一个实例。懒汉式和饿汉式是单例模式的两种常见实现方式,各有优缺点,应根据具体应用场景选择适合的实现方式。
推荐文章