[API reference](https://evolu.dev/docs/api-reference) › [@evolu/common](https://evolu.dev/docs/api-reference/common) › [Task](https://evolu.dev/docs/api-reference/common/Task) › Mutex

Defined in: [packages/common/src/Task.ts:2737](https://github.com/evoluhq/evolu/blob/e7144e2bbe9069362b62dec1b64a8aa922b8f1b0/packages/common/src/Task.ts#L2737)

A mutex (mutual exclusion) that ensures only one [Task](https://evolu.dev/docs/api-reference/common/Task/type-aliases/Task) runs at a time.

This is a specialized version of a [Semaphore](https://evolu.dev/docs/api-reference/common/Task/interfaces/Semaphore) with a permit count of 1.

### Example

```ts
await using run = createRun();

const mutex = createMutex();

const task =
  (id: string): Task<void> =>
  async (run) => {
    const { console } = run.deps;
    console.log("start", id);
    await run(sleep("10ms"));
    console.log("end", id);
    return ok();
  };

await Promise.all([
  run(mutex.withLock(task("1"))),
  run(mutex.withLock(task("2"))),
]);

// start 1
// end 1
// start 2
// end 2
```

## Extends

- [`Disposable`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-2.html#using-declarations-and-explicit-resource-management)

## Methods

<a id="dispose"></a>

### \[dispose\]()

```ts
dispose: void;
```

Defined in: node_modules/.bun/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.disposable.d.ts:36

#### Inherited from

```ts
Disposable.[dispose]
```

## Properties

<a id="snapshot"></a>

### snapshot

```ts
readonly snapshot: () => SemaphoreSnapshot;
```

Defined in: [packages/common/src/Task.ts:2747](https://github.com/evoluhq/evolu/blob/e7144e2bbe9069362b62dec1b64a8aa922b8f1b0/packages/common/src/Task.ts#L2747)

Returns the current mutex state for monitoring/debugging.

### withLock

```ts
readonly withLock: <T, E, D>(task: Task<T, E, D>) => Task<T, E, D>;
```

Defined in: [packages/common/src/Task.ts:2744](https://github.com/evoluhq/evolu/blob/e7144e2bbe9069362b62dec1b64a8aa922b8f1b0/packages/common/src/Task.ts#L2744)

Executes a [Task](https://evolu.dev/docs/api-reference/common/Task/type-aliases/Task) while holding the mutex lock.

Only one Task can hold the lock at a time. Other Tasks wait until the lock
is released.