当前位置:首页 > JavaScript

js实现锁

2026-03-13 16:57:36JavaScript

使用闭包实现锁

闭包可以封装私有变量,通过返回的函数控制访问权限。这种方式适合简单的锁机制。

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的简单实现。

js实现锁

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适合多线程,分布式锁适合跨标签页或服务端场景。选择时应根据具体需求决定。

标签: js
分享给朋友:

相关文章

js实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previo…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…

利用js实现

利用js实现

使用 JavaScript 实现 在 JavaScript 中,可以通过多种方式实现功能,具体取决于需求。以下是几种常见的方法: 方法一:使用原生 JavaScript // 示例代码…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <di…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…