面试题答案
一键面试设计思路
- 懒加载:使用一个标志位来判断工具类是否已经初始化,只有在首次调用静态方法且未初始化时才进行初始化。
- 并发安全:利用JavaScript的
Promise
和async/await
特性来处理异步操作,并通过Double - Checked Locking
机制在多线程环境下确保初始化过程的线程安全。
TypeScript 代码实现
class ExpensiveTool {
private static initialized = false;
private static initializationPromise: Promise<void> | null = null;
// 模拟复杂的初始化操作
private static async initialize(): Promise<void> {
// 这里可以是实际的复杂初始化逻辑,例如数据库连接、文件读取等
await new Promise(resolve => setTimeout(resolve, 1000));
console.log('Tool initialized');
}
public static async expensiveStaticMethod(): Promise<void> {
if (!ExpensiveTool.initialized) {
if (!ExpensiveTool.initializationPromise) {
ExpensiveTool.initializationPromise = ExpensiveTool.initialize();
}
await ExpensiveTool.initializationPromise;
ExpensiveTool.initialized = true;
ExpensiveTool.initializationPromise = null;
}
// 这里是静态方法的实际逻辑
console.log('Executing expensive static method');
}
}
使用示例
// 模拟多线程环境下的调用
async function testConcurrentCalls() {
const promises: Promise<void>[] = [];
for (let i = 0; i < 5; i++) {
promises.push(ExpensiveTool.expensiveStaticMethod());
}
await Promise.all(promises);
}
testConcurrentCalls();
在上述代码中,ExpensiveTool
类有一个静态属性initialized
用于标记是否已经初始化,initializationPromise
用于存储初始化过程的Promise
。initialize
方法模拟复杂的初始化操作。expensiveStaticMethod
方法在每次调用时首先检查是否已经初始化,如果没有则进行初始化,并确保在多线程环境下初始化过程只执行一次。testConcurrentCalls
函数模拟了多线程环境下的并发调用。