当前位置:首页 > 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 功能的方法 在 JavaScript 中实现特定功能通常涉及多个步骤。以下是常见的实现方法: 基础语法和变量声明 使用 let 或 const 声明变量: let co…

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval 实…

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="slid…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…

js实现tab选项卡切换

js实现tab选项卡切换

实现Tab选项卡切换的JavaScript方法 使用纯JavaScript实现Tab切换功能,可以通过监听点击事件动态切换内容显示状态。以下是两种常见实现方式: 基础DOM操作实现 // 获取所有…