MST
星途 面试题库

面试题:JavaScript 数组元素添加删除并发处理的基础实现

假设你有一个 JavaScript 数组,在多线程环境(模拟多任务执行场景,可借助 `setTimeout` 模拟异步任务)下,如何安全地向数组添加新元素和删除特定元素?请编写代码实现,并说明思路。
27.9万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

思路

在JavaScript中,虽然本身是单线程的,但可以通过setTimeout模拟多任务执行场景。为了安全地操作数组(添加和删除元素),可以使用一个锁机制来确保同一时间只有一个任务可以操作数组,避免竞态条件。

代码实现

let array = [];
let lock = false;

function addElement(element) {
    return new Promise((resolve) => {
        while (lock);
        lock = true;
        setTimeout(() => {
            array.push(element);
            lock = false;
            resolve();
        }, 0);
    });
}

function deleteElement(index) {
    return new Promise((resolve) => {
        while (lock);
        lock = true;
        setTimeout(() => {
            if (index >= 0 && index < array.length) {
                array.splice(index, 1);
            }
            lock = false;
            resolve();
        }, 0);
    });
}

// 使用示例
addElement(1).then(() => {
    return addElement(2);
}).then(() => {
    return deleteElement(0);
}).then(() => {
    console.log(array);
});

在上述代码中:

  1. lock变量作为锁,初始值为false,表示当前没有任务在操作数组。
  2. addElement函数和deleteElement函数都通过while (lock)等待锁释放,然后设置locktrue获取锁。
  3. 使用setTimeout模拟异步任务,在任务完成后释放锁(设置lockfalse)。
  4. 代码通过Promise链式调用展示了如何依次安全地执行添加和删除操作,并在最后打印数组结果。