js实现锁
使用闭包实现锁
闭包可以封装私有变量,通过返回的函数控制访问权限。这种方式适合简单的锁机制。
function createLock() {
let locked = false;
return {
acquire: function() {
if (locked) return false;
locked = true;
return true;
},
release: function() {
locked = false;
},
isLocked: function() {
return locked;
}
};
}
const lock = createLock();
lock.acquire(); // true
lock.acquire(); // false
使用Promise实现异步锁
对于异步操作,可以使用Promise实现更复杂的锁逻辑。这种锁在资源释放前会排队等待。
class AsyncLock {
constructor() {
this.queue = [];
this.locked = false;
}
acquire() {
return new Promise(resolve => {
if (!this.locked) {
this.locked = true;
resolve();
} else {
this.queue.push(resolve);
}
});
}
release() {
if (this.queue.length > 0) {
const nextResolve = this.queue.shift();
nextResolve();
} else {
this.locked = false;
}
}
}
const lock = new AsyncLock();
await lock.acquire();
// 临界区代码
lock.release();
使用Web Locks API
现代浏览器提供了Web Locks API,专门用于管理资源锁。这个API更适用于浏览器环境。
navigator.locks.request('my_resource', async lock => {
// 临界区代码
// 锁会自动释放
});
使用SharedArrayBuffer和Atomics
对于多线程场景(如Web Worker),可以使用SharedArrayBuffer配合Atomics操作实现低级锁。
// 在主线程
const sab = new SharedArrayBuffer(4);
const lock = new Int32Array(sab);
// 在Worker线程
Atomics.wait(lock, 0, 0); // 等待锁
Atomics.store(lock, 0, 1); // 获取锁
// 临界区代码
Atomics.store(lock, 0, 0); // 释放锁
Atomics.notify(lock, 0, 1); // 通知等待线程
使用数据库或存储实现分布式锁
在分布式系统中,可以使用数据库或存储服务实现锁。以下是使用localStorage的简单实现。

function acquireDistributedLock(key, timeout = 5000) {
const endTime = Date.now() + timeout;
while (Date.now() < endTime) {
if (!localStorage.getItem(key)) {
localStorage.setItem(key, 'locked');
return true;
}
// 短暂等待后重试
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 100);
}
return false;
}
function releaseDistributedLock(key) {
localStorage.removeItem(key);
}
每种实现方式适用于不同场景,闭包和Promise适合单线程应用,Web Locks API适合浏览器环境,SharedArrayBuffer适合多线程,分布式锁适合跨标签页或服务端场景。选择时应根据具体需求决定。






