当前位置: 技术文章>> 100道Java面试题之-什么是Java中的单例模式?请实现一个懒汉式和饿汉式的单例模式。
文章标题:100道Java面试题之-什么是Java中的单例模式?请实现一个懒汉式和饿汉式的单例模式。
### 什么是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关键字来禁止指令重排序,并通过双重检查来减少锁的开销,但实现起来相对复杂。
### 总结
单例模式是一种常见的设计模式,用于控制资源的使用,确保全局只有一个实例。懒汉式和饿汉式是单例模式的两种常见实现方式,各有优缺点,应根据具体应用场景选择适合的实现方式。