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.

* Some parts of this feature may have varying levels of support.

Объект 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® 2025 Language Specification
# sec-atomics-object

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

Report problems with this compatibility data on GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
Node.js
Atomics
Atomic operations on non-shared ArrayBuffer objects
add
and
compareExchange
exchange
isLockFree
load
notify
or
pause
Experimental
store
sub
wait
waitAsync
xor

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support
In development. Supported in a pre-release version.
In development. Supported in a pre-release version.
No support
No support
Experimental. Expect behavior to change in the future.
See implementation notes.

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

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

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