MST

星途 面试题库

面试题:JavaScript函数构造函数并发处理中的资源竞争与解决

在使用JavaScript函数构造函数进行并发处理时,可能会遇到资源竞争问题。请举例说明资源竞争在并发处理场景中是如何产生的,并且提出至少两种有效的解决方案,并通过代码实现其中一种方案。
13.1万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

资源竞争产生示例

假设有一个共享变量 count,多个并发的函数构造函数实例都尝试对其进行加1操作。由于JavaScript是单线程语言,但在浏览器环境下可以通过Web Workers或在Node.js环境下通过child_process等实现并发(这里以模拟并发为例)。

function Counter() {
    this.count = 0;
    this.increment = function() {
        this.count++;
    };
}

const counter1 = new Counter();
const counter2 = new Counter();

// 模拟并发调用
setTimeout(() => counter1.increment(), 100);
setTimeout(() => counter2.increment(), 200);

// 预期结果count应该为2,但由于资源竞争,结果可能小于2
console.log(counter1.count); 

上述代码中,count 是共享资源,两个不同的实例并发操作它,就可能出现资源竞争,导致最终结果不是预期的2。

解决方案

  1. 锁机制:通过一个标志位来表示资源是否正在被使用,只有当资源可用时才能进行操作。
  2. 队列化操作:将所有对共享资源的操作放入一个队列,按顺序依次执行,避免并发操作。

代码实现锁机制方案

function Counter() {
    this.count = 0;
    this.lock = false;
    this.increment = function() {
        if (this.lock) {
            setTimeout(() => this.increment(), 100);
            return;
        }
        this.lock = true;
        this.count++;
        this.lock = false;
    };
}

const counter1 = new Counter();
const counter2 = new Counter();

// 模拟并发调用
setTimeout(() => counter1.increment(), 100);
setTimeout(() => counter2.increment(), 200);

// 最终结果count会是2
setTimeout(() => console.log(counter1.count), 500);