当前位置:首页 > JavaScript

JS原子锁实现

2026-03-16 05:29:34JavaScript

原子锁的概念

原子锁(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函数的暂停特性:

JS原子锁实现

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运行环境提供了原子锁的实现思路,实际应用中需要根据具体场景选择合适方案。

标签: 原子JS
分享给朋友:

相关文章

JS实现文本的删除

JS实现文本的删除

使用 substring() 方法 通过指定起始和结束索引截取字符串的一部分,间接实现删除效果。 let str = "Hello World"; let newStr = str.substr…

JS实现inpubox

JS实现inpubox

实现 InputBox 的基本结构 使用 HTML 和 CSS 创建一个基础的输入框结构,确保样式简洁且易于扩展。 <div class="input-box"> <input…

JS实现并发请求

JS实现并发请求

使用Promise.all实现并发请求 Promise.all可以同时发起多个异步请求,并在所有请求完成后统一处理结果。该方法适用于需要同时获取多个独立数据的场景。 const urls = ['u…

JS原子锁实现

JS原子锁实现

实现原子锁的方法 使用JavaScript的Atomics对象和SharedArrayBuffer可以实现原子锁。Atomics提供了一组静态方法用于对SharedArrayBuffer进行原子操作,…

php实现原子操作

php实现原子操作

PHP实现原子操作的方法 原子操作指在多线程或并发环境下不可分割的操作,确保操作要么完全执行,要么完全不执行。PHP作为脚本语言,原生不支持多线程,但在并发场景(如Web请求、CLI脚本)中仍需处理共…

JS实现跳表

JS实现跳表

跳表(Skip List)简介 跳表是一种基于概率的平衡数据结构,通过多层链表实现高效查找、插入和删除操作,时间复杂度为 $O(\log n)$。其核心思想是通过“跳跃”式访问节点减少遍历次数。 跳…