JS原子锁实现
原子锁的概念
原子锁(Atomic Lock)是一种在多线程或并发环境下确保操作原子性的机制。在JavaScript中,由于单线程特性,通常不需要传统意义上的锁机制,但在Web Workers或Node.js的多线程环境中可能需要类似实现。
基于SharedArrayBuffer的原子操作
现代JavaScript提供了SharedArrayBuffer和Atomics API来实现真正的原子操作:
// 创建共享内存
const sharedBuffer = new SharedArrayBuffer(4);
const sharedArray = new Int32Array(sharedBuffer);
// 原子加锁
function acquireLock() {
while (true) {
const oldValue = Atomics.compareExchange(sharedArray, 0, 0, 1);
if (oldValue === 0) {
return;
}
Atomics.wait(sharedArray, 0, 1);
}
}
// 原子解锁
function releaseLock() {
Atomics.store(sharedArray, 0, 0);
Atomics.notify(sharedArray, 0, 1);
}
基于Promise的模拟实现
在单线程环境中可以用Promise模拟锁行为:
let _lock = Promise.resolve();
const atomicLock = {
acquire: () => {
let release;
const newLock = new Promise(resolve => {
release = resolve;
});
const oldLock = _lock;
_lock = newLock;
return oldLock.then(() => release);
}
};
// 使用示例
async function criticalSection() {
const release = await atomicLock.acquire();
try {
// 临界区代码
} finally {
release();
}
}
基于Generator的协程控制
另一种实现方式是利用Generator函数的暂停特性:

function* atomicOperation() {
while (true) {
const lock = yield;
if (!lock.held) {
lock.held = true;
yield 'ACQUIRED';
lock.held = false;
return;
}
}
}
const lock = { held: false };
const op = atomicOperation();
op.next(); // 初始化
注意事项
- 浏览器环境下需要启用跨域隔离才能使用SharedArrayBuffer
- Node.js中可以通过worker_threads模块实现类似功能
- 原子操作会带来性能开销,应谨慎使用
- 避免死锁情况,确保锁总是能被释放
以上方法根据不同的JavaScript运行环境提供了原子锁的实现思路,实际应用中需要根据具体场景选择合适方案。






