面试题答案
一键面试实现思路
- 双重检查锁定(Double - Checked Locking):使用静态变量来存储
Database
实例,在获取实例的方法中,首先检查实例是否已存在,如果不存在则进入同步块再次检查并创建实例,这样可以避免每次获取实例时都进行同步操作,提高效率。 - 异常处理:在初始化方法中,对加载配置文件和网络请求等可能出现错误的操作进行异常捕获,根据不同类型的异常进行相应处理,如记录日志、返回错误信息等。
- 线程安全的单例模式:通过
private
构造函数防止外部实例化,确保只有一个Database
实例被创建。
关键代码片段(以Java为例)
public class Database {
private static volatile Database instance;
private String config;
// 私有构造函数
private Database() {
try {
// 加载配置文件
loadConfigFile();
// 网络请求获取最新配置
fetchLatestConfig();
} catch (Exception e) {
// 处理配置文件格式错误或网络请求失败等异常
handleException(e);
}
}
// 获取实例的方法
public static Database getInstance() {
if (instance == null) {
synchronized (Database.class) {
if (instance == null) {
instance = new Database();
}
}
}
return instance;
}
private void loadConfigFile() throws Exception {
// 模拟加载配置文件操作
// 可能抛出配置文件格式错误异常
throw new Exception("模拟配置文件格式错误");
}
private void fetchLatestConfig() throws Exception {
// 模拟网络请求获取最新配置操作
// 可能抛出网络请求失败异常
throw new Exception("模拟网络请求失败");
}
private void handleException(Exception e) {
// 记录日志
System.err.println("初始化错误: " + e.getMessage());
// 可以进一步采取其他处理措施,如返回默认配置等
}
}
在上述代码中:
volatile
关键字保证了instance
变量的可见性,防止指令重排序,确保在多线程环境下双重检查锁定的正确性。synchronized
关键字确保在创建实例时只有一个线程能够进入同步块,避免多个线程同时创建实例。loadConfigFile
和fetchLatestConfig
方法模拟了可能出现错误的初始化操作,handleException
方法用于处理这些异常。