面试题答案
一键面试资源竞争产生示例
假设有一个共享变量 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。
解决方案
- 锁机制:通过一个标志位来表示资源是否正在被使用,只有当资源可用时才能进行操作。
- 队列化操作:将所有对共享资源的操作放入一个队列,按顺序依次执行,避免并发操作。
代码实现锁机制方案
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);