Семафор размера 1


Мне было интересно, как реализовать простой семафор размером 1 на JavaScript. Я придумал и испытал его немного, и хотел убедиться, что она охватывает все случаи.

/**
 * usage:
 *  const semaphore = new SemaphoreOfSizeOne();
 *  const release = await semaphore.acquire();
 *  ************* CRITICAL CODE START ***************
 *
 *  ************* CRITICAL CODE ENDED ***************
 *  await release();
 *
 */
class SemaphoreOfSizeOne {
  constructor() {
    this.resource = Promise.resolve();
  }

  acquire() {
    let release_handler = null;

    // the executor is called before the Promise constructor even returns the created object
    const promise = new Promise((resolve) => {
      release_handler = resolve;
    });

    const toReturn = this.resource.then(() => {
      return release_handler;
    });

    this.resource = this.resource.then(() => promise);
    return toReturn;
  }
}


Комментарии