当前位置:首页 > JavaScript

js实现锁

2026-01-31 19:03:50JavaScript

实现互斥锁(Mutex)

在JavaScript中实现锁机制可以通过Promise和异步控制来实现。以下是一个简单的互斥锁实现:

class Mutex {
  constructor() {
    this._locked = false;
    this._queue = [];
  }

  lock() {
    return new Promise((resolve) => {
      if (!this._locked) {
        this._locked = true;
        resolve();
      } else {
        this._queue.push(resolve);
      }
    });
  }

  unlock() {
    if (this._queue.length > 0) {
      const nextResolve = this._queue.shift();
      nextResolve();
    } else {
      this._locked = false;
    }
  }
}

使用方法:

const mutex = new Mutex();

async function criticalSection() {
  await mutex.lock();
  try {
    // 临界区代码
  } finally {
    mutex.unlock();
  }
}

实现读写锁

读写锁允许多个读取或单个写入操作:

js实现锁

class ReadWriteLock {
  constructor() {
    this._readers = 0;
    this._writers = 0;
    this._readQueue = [];
    this._writeQueue = [];
  }

  async readLock() {
    return new Promise((resolve) => {
      if (this._writers === 0 && this._writeQueue.length === 0) {
        this._readers++;
        resolve();
      } else {
        this._readQueue.push(resolve);
      }
    });
  }

  async writeLock() {
    return new Promise((resolve) => {
      if (this._readers === 0 && this._writers === 0) {
        this._writers++;
        resolve();
      } else {
        this._writeQueue.push(resolve);
      }
    });
  }

  readUnlock() {
    this._readers--;
    if (this._readers === 0 && this._writeQueue.length > 0) {
      const nextResolve = this._writeQueue.shift();
      this._writers++;
      nextResolve();
    }
  }

  writeUnlock() {
    this._writers--;
    if (this._readQueue.length > 0) {
      while (this._readQueue.length > 0) {
        const nextResolve = this._readQueue.shift();
        this._readers++;
        nextResolve();
      }
    } else if (this._writeQueue.length > 0) {
      const nextResolve = this._writeQueue.shift();
      this._writers++;
      nextResolve();
    }
  }
}

使用Atomics实现锁

在SharedArrayBuffer环境下可以使用Atomics实现更底层的锁:

// 在Worker线程中
const sharedBuffer = new SharedArrayBuffer(4);
const lock = new Int32Array(sharedBuffer);

// 加锁
Atomics.wait(lock, 0, 0);  // 等待锁可用
Atomics.store(lock, 0, 1); // 获取锁

// 解锁
Atomics.store(lock, 0, 0); // 释放锁
Atomics.notify(lock, 0, 1); // 通知等待的线程

使用Web Locks API

现代浏览器提供了Web Locks API:

js实现锁

navigator.locks.request('resource_name', async lock => {
  // 临界区代码
});

注意事项

JavaScript是单线程语言,大多数锁机制用于协调异步操作或Web Worker间的同步。主线程中的同步代码不需要锁机制,因为JavaScript的事件循环保证了代码执行的原子性。

对于Web Worker间的同步,SharedArrayBuffer和Atomics提供了底层同步原语,但需要服务器设置适当的CORS头。

Web Locks API是最新的标准方法,但浏览器兼容性需要考虑。

标签: js
分享给朋友:

相关文章

js 实现分页

js 实现分页

实现分页的基本逻辑 分页功能通常需要后端返回数据总量或总页数,前端根据当前页码和每页条数截取对应数据。以下是一个基于JavaScript的简单分页实现方案: 前端分页实现 假设已有从后端获取的完整数…

js实现延迟

js实现延迟

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

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含…

js图片轮播的实现

js图片轮播的实现

基础图片轮播实现 使用HTML、CSS和JavaScript实现一个简单的图片轮播效果。HTML部分定义轮播容器和图片,CSS负责样式和过渡效果,JavaScript处理逻辑。 <div cl…

实现继承js

实现继承js

实现继承的方式 在JavaScript中,实现继承可以通过多种方式完成,每种方式都有其优缺点。以下是几种常见的实现继承的方法: 原型链继承 原型链继承是最基本的继承方式,通过将子类的原型指向父类的实…

js实现复选框

js实现复选框

实现复选框的基本方法 使用HTML的<input type="checkbox">元素创建复选框,并通过JavaScript监听其状态变化。 <input type="checkb…