Atomics

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since December 2021.

Объект Atomics предоставляет атомарные операции как статические методы. Используется вместе с объектом SharedArrayBuffer.

Атомарные операции установлены в модуле Atomics. В отличие от других глобальных объектов, Atomics не является конструктором. Его нельзя использовать вместе с оператором new или вызывать объект Atomics как функцию. Все свойства и методы Atomics статические (как у объекта Math, к примеру).

Свойства

Atomics[Symbol.toStringTag]

Значение этого свойства - "Atomics".

Методы

Атомарные операции

Когда память разделена, несколько потоков могут читать и записывать одни и те же данные в память. Атомарные операции гарантируют, что ожидаемые значения будут записаны и прочитаны, а операции завершены, прежде чем следующая операция начнёт свою работу, и они не будут прерваны.

Atomics.add()

Добавляет представленное значение к текущему по указанной позиции в массиве. Возвращает предыдущее значение в этой позиции.

Atomics.and()

Вычисляет побитовое AND в указанной позиции массива. Возвращает предыдущее значение в этой позиции.

Atomics.compareExchange()

Сохраняет представленное значение в указанную позицию массива, если оно эквивалентно представленному значению. Возвращает предыдущее значение.

Atomics.exchange()

Сохраняет представленное значение в указанную позицию массива. Возвращает предыдущее значение.

Atomics.load()

Возвращает значение из указанной позиции массива.

Atomics.or()

Вычисляет побитовое OR в указанной позиции массива. Возвращает предыдущее значение в этой позиции.

Atomics.store()

Сохраняет представленное значение в указанную позицию массива. Возвращает значение.

Atomics.sub()

Вычитает представленное значение из текущего по указанной позиции в массиве. Возвращает предыдущее значение в этой позиции.

Atomics.xor()

Вычисляет побитовое XOR в указанной позиции массива. Возвращает предыдущее значение в этой позиции.

Wait и notify

wait() и wake() методы моделируются на основе futexes ("fast user-space mutex" - быстрый мьютекс пользовательского пространства) Linux и предоставляют собой способы ожидания момента, когда определённое состояние не станет true, и обычно используется как блокирующие конструкции.

Atomics.wait()

Проверяет, содержится в указанной позиции массива все ещё представленное значение и спит в ожидании или тайм-аут. Возвращает "ok", "not-equal" или "timed-out". Если ожидание не разрешено в вызывающем агенте, тогда выбросит ошибку исключения (большинство браузеров не разрешают wait() в главном потоке браузера).

Atomics.wake()

Пробуждает некоторых агентов, которые спят в очереди ожидания в указанной позиции массива. Возвращает количество агентов, которые были разбужены.

Atomics.isLockFree(size)

Оптимизационный примитив, который может быть использован для определения использовать ли блокирующие операции или атомарные. Возвращает true, если атомарные операции над массивами с указанным размерами элементов будут выполнены с использованием аппаратных атомарных операций (как противоположность блокирующим). Только для специалистов.

Спецификации

Specification
ECMAScript Language Specification
# sec-atomics-object

Совместимость с браузерами

BCD tables only load in the browser

Похожие заметки

До SpiderMonkey 48, финальные имена API и семантика не были ещё реализованы. Изменения между Firefox v. 46 и v. 48:

Смотрите также