MST

星途 面试题库

面试题:TypeScript 类静态方法在复杂场景下的设计与优化

在一个大型项目中,有多个模块依赖于一个工具类的静态方法。该静态方法执行时需要进行复杂的初始化步骤,且这个初始化过程开销较大。请设计一个方案,既能保证静态方法被首次调用时正确初始化,又能避免重复初始化带来的性能损耗,同时要考虑多线程环境下的并发安全问题(假设使用的运行环境支持多线程),请用TypeScript代码实现并解释设计思路。
47.6万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 懒加载:使用一个标志位来判断工具类是否已经初始化,只有在首次调用静态方法且未初始化时才进行初始化。
  2. 并发安全:利用JavaScript的Promiseasync/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用于存储初始化过程的Promiseinitialize方法模拟复杂的初始化操作。expensiveStaticMethod方法在每次调用时首先检查是否已经初始化,如果没有则进行初始化,并确保在多线程环境下初始化过程只执行一次。testConcurrentCalls函数模拟了多线程环境下的并发调用。