当前位置:首页 > 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实现跳表

跳表的基本概念 跳表(Skip List)是一种基于概率的数据结构,允许快速查询、插入和删除操作,时间复杂度平均为O(log n)。它通过多层链表实现,每一层都是下一层的子集,高层链表跳过多个元素,从…

JS如何访问react内部的数据

JS如何访问react内部的数据

访问 React 组件内部数据的方法 在 React 中,组件内部的数据通常通过 state 或 props 管理。以下是几种常见的访问方式: 通过 state 访问数据 React 组件的内部状态…

JS实现日期滚动选择

JS实现日期滚动选择

实现日期滚动选择的基本思路 使用HTML、CSS和JavaScript创建一个日期滚动选择器,允许用户通过滚动选择年、月、日。核心是通过监听滚动事件,动态更新显示的值。 HTML结构 创建一个包含年…

JS实现文本的删除

JS实现文本的删除

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

JS能实现跨平台吗

JS能实现跨平台吗

JavaScript 的跨平台能力 JavaScript 是一种高度灵活的脚本语言,通过不同运行时环境和工具链可以实现跨平台开发。以下是其跨平台能力的核心实现方式: 浏览器环境 JavaScript…

用JS实现冰墩墩

用JS实现冰墩墩

以下是用JavaScript绘制冰墩墩的几种实现方法,结合Canvas绘图和SVG路径数据: 使用Canvas绘制基础轮廓 const canvas = document.createEleme…