Atomics
=======

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

Свойства
--------

`Atomics[Symbol.toStringTag]`

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

Методы
------

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

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

`Atomics.add()`

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

`Atomics.and()` (en-US)

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

`Atomics.compareExchange()` (en-US)

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

`Atomics.exchange()` (en-US)

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


`Atomics.load()` (en-US)

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

`Atomics.or()` (en-US)

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

`Atomics.store()` (en-US)

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

`Atomics.sub()`

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

`Atomics.xor()` (en-US)

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

### Wait и notify

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

`Atomics.wait()` (en-US)

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

`Atomics.wake()` (en-US)

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

`Atomics.isLockFree(size)` (en-US)

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

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

| Specification |
| --- |
| ECMAScript Language Specification # sec-atomics-object |

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

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

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

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

* Методы `Atomics.futexWakeOrRequeue()` и `Atomics.fence()` полностью удалены (Firefox bug 1259544 и Firefox bug 1225028).
* Методы `Atomics.wait()` (en-US) и `Atomics.wake()` (en-US) были названы `Atomics.futexWait()` и `Atomics.futexWake()` (Firefox bug 1260910). Примечание: старые имена были удалены в версии 49 и младше (Firefox bug 1262062).
* Свойства `Atomics.OK`, `Atomics.TIMEDOUT`, `Atomics.NOTEQUAL` были удалены. `Atomics.wait()` (en-US) метод теперь возвращает строки "ok", "timed-out" и "not-equal" (Firefox bug 1260835).
* Параметр `count` метода `Atomics.wake()` (en-US) изменился: теперь он по умолчанию равен `+Infinity`, а не `0` (Firefox bug 1253350).
Смотрите также
--------------

* `ArrayBuffer`
* JavaScript typed arrays
* Web Workers
* parlib-simple – a simple library providing synchronization and work distribution abstractions.
* Shared Memory – a brief tutorial
* A Taste of JavaScript's New Parallel Primitives – Mozilla Hacks