面试题答案
一键面试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();