MST

星途 面试题库

面试题:JavaScript闭包模块下的类对象并发资源竞争处理

在JavaScript的闭包模块构建的类对象场景中,假设存在多个并发任务同时访问和修改共享资源,可能会引发资源竞争问题。请描述你会采取哪些策略来避免这类问题,例如使用锁机制、队列等方式,并结合代码说明如何在实际场景中实现。
21.8万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

1. 使用锁机制

在JavaScript中,可以通过模拟实现一个简单的锁机制来控制对共享资源的访问。

// 模拟一个共享资源
let sharedResource = 0;
// 锁标志
let isLocked = false;

// 获取锁
function lock() {
    while (isLocked) {
        // 等待锁被释放
    }
    isLocked = true;
}

// 释放锁
function unlock() {
    isLocked = false;
}

// 并发任务函数
function concurrentTask() {
    lock();
    try {
        // 访问和修改共享资源
        sharedResource++;
        console.log(`Task modified sharedResource to: ${sharedResource}`);
    } finally {
        unlock();
    }
}

// 模拟多个并发任务
for (let i = 0; i < 5; i++) {
    setTimeout(concurrentTask, i * 100);
}

2. 使用队列

可以将对共享资源的操作放入队列中,依次执行,从而避免资源竞争。

// 模拟一个共享资源
let sharedResource = 0;
// 任务队列
let taskQueue = [];

// 向队列添加任务
function enqueueTask(task) {
    taskQueue.push(task);
    processQueue();
}

// 处理队列中的任务
function processQueue() {
    if (taskQueue.length === 0) return;
    const task = taskQueue.shift();
    task();
    processQueue();
}

// 并发任务函数
function concurrentTask() {
    return function() {
        // 访问和修改共享资源
        sharedResource++;
        console.log(`Task modified sharedResource to: ${sharedResource}`);
    };
}

// 模拟多个并发任务
for (let i = 0; i < 5; i++) {
    enqueueTask(concurrentTask());
}

3. 使用Promise和async/await

通过Promise和async/await可以顺序执行异步操作,避免资源竞争。

// 模拟一个共享资源
let sharedResource = 0;

// 并发任务函数
async function concurrentTask() {
    // 模拟异步操作
    await new Promise(resolve => setTimeout(resolve, 100));
    // 访问和修改共享资源
    sharedResource++;
    console.log(`Task modified sharedResource to: ${sharedResource}`);
}

// 模拟多个并发任务
async function runTasks() {
    for (let i = 0; i < 5; i++) {
        await concurrentTask();
    }
}

runTasks();