在JavaScript中创建一个同步锁

22 min read

在JavaScript中可以使用Promise对象和async/await语法来实现一个类似于同步锁的功能。以下是一个示例代码:

class SyncLock {
  constructor() {
    this.isLocked = false;
  }

  async lock() {
    while (this.isLocked) {
      await new Promise((resolve) => setTimeout(resolve, 100));
    }
    this.isLocked = true;
  }

  unlock() {
    this.isLocked = false;
  }
}

// 使用示例
const lock = new SyncLock();

async function doWork() {
  await lock.lock();
  console.log("Work in progress...");
  await new Promise((resolve) => setTimeout(resolve, 2000)); // 模拟耗时操作
  console.log("Work complete!");
  lock.unlock();
}

doWork();

在上面的示例中,通过lockunlock方法来实现同步锁的锁定和解锁操作。在doWork函数中,首先调用lock.lock()方法来获取锁,然后执行需要同步的操作,最后调用lock.unlock()方法来释放锁。

值得注意的是,JavaScript是单线程执行的,所以在大多数情况下不需要使用同步锁来控制并发访问。但在特定情况下,如在Web Worker中执行耗时操作时,可能需要使用类似于同步锁的机制来保证数据的正确性。