MST

星途 面试题库

面试题:JavaScript 中如何在并发处理函数属性时避免竞态条件

在 JavaScript 环境下,假设你有一个对象,对象上的函数属性需要在并发场景下被调用,例如多个异步任务可能同时调用该函数属性。请描述一种方法来避免竞态条件,确保数据的一致性和正确性,并给出简单代码示例。
45.1万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

在JavaScript中处理并发场景下对象函数属性调用避免竞态条件,可以使用async/await结合Promise以及锁机制。以下是具体方法及示例:

  1. 使用async/awaitPromise实现简单锁机制
    • 定义一个锁状态变量和获取锁、释放锁的函数。
    • 在需要避免竞态条件的函数中,先获取锁,操作完成后释放锁。
let lock = false;

async function acquireLock() {
    while (lock) {
        await new Promise(resolve => setTimeout(resolve, 100));
    }
    lock = true;
}

function releaseLock() {
    lock = false;
}

const myObject = {
    data: 0,
    async concurrentFunction() {
        await acquireLock();
        try {
            // 模拟异步操作
            await new Promise(resolve => setTimeout(resolve, 100));
            this.data++;
            console.log('Data incremented:', this.data);
        } finally {
            releaseLock();
        }
    }
};

// 模拟多个异步任务同时调用
const tasks = Array.from({ length: 5 }, () => myObject.concurrentFunction());
Promise.all(tasks).then(() => {
    console.log('All tasks completed. Final data:', myObject.data);
});

在上述代码中:

  • acquireLock函数通过循环等待直到锁lockfalse,然后设置locktrue获取锁。
  • releaseLock函数将lock设置为false释放锁。
  • myObject.concurrentFunction函数在执行核心逻辑前先调用acquireLock获取锁,完成后在finally块中调用releaseLock释放锁,确保数据一致性。
  • 最后通过Promise.all模拟多个异步任务同时调用concurrentFunction