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 メソッドと wake メソッド

wait() メソッドと wake() メソッドは、Linux の futex ("fast user-space mutex") を原型としており、特定の条件が true になるまで待つ手段を提供します。一般的にはブロッキングコンストラクト (blocking constructs) として使用されます。

Atomics.wait()
配列の指定位置に指定した値が含まれているか検証し、スリープで待機するかタイムアウトします。"ok", "not-equal", "timed-out" のいずれかの文字列を返します。呼び出したエージェントで待機が許可されていない場合、Error 例外を投げます (ほとんどのブラウザーは、ブラウザーのメインスレッドで wait() を許可しません。)。
Atomics.wake()
配列の指定位置の wait キューでスリープ中のエージェントを起動します。起動したエージェントの数を返します。
Atomics.isLockFree(size)
ロック機構とアトミック演算のどちらを使用するかを決定するための最適化プリミティブです。指定した要素サイズの配列上のアトミック演算がハードウェアによるアトミック演算を使用するよう実装されている場合、true を返します (それに対してロックの場合は false を返します)。専門家だけが使用してください。

仕様

仕様書 策定状況 コメント
ECMAScript Latest Draft (ECMA-262)
Atomics の定義
ドラフト ES2017 で初期定義。
ECMAScript 2017 (ECMA-262)
Atomics の定義
標準  

ブラウザー実装状況

機能ChromeEdgeFirefoxInternet ExplorerOperaSafari
基本対応601 なし2

573 4

55 — 57

46 — 555

なし なし10.1 —?
add601 なし2

573 4

55 — 57

46 — 555

なし なし10.1 —?
and601 なし2

573 4

55 — 57

46 — 555

なし なし10.1 —?
compareExchange601 なし2

573 4

55 — 57

46 — 555

なし なし10.1 —?
exchange601 なし2

573 4

55 — 57

46 — 555

なし なし10.1 —?
isLockFree601 なし2

573 4

55 — 57

46 — 555

なし なし10.1 —?
load601 なし2

573 4

55 — 57

46 — 555

なし なし10.1 —?
or601 なし2

573 4

55 — 57

46 — 555

なし なし10.1 —?
store601 なし2

573 4

55 — 57

46 — 555

なし なし10.1 —?
sub601 なし2

573 4

55 — 57

46 — 555

なし なし10.1 —?
wait601 なし2

573 4

55 — 57

46 — 555

なし なし10.1 —?
wake601 なし2

573 4

55 — 57

46 — 555

なし なし10.1 —?
xor601 なし2

573 4

55 — 57

46 — 555

なし なし10.1 —?
機能Android webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
基本対応601601 ?

573 4

55 — 57

46 — 555

なし なし なし
add601601 ?

573 4

55 — 57

46 — 555

なし なし なし
and601601 ?

573 4

55 — 57

46 — 555

なし なし なし
compareExchange601601 ?

573 4

55 — 57

46 — 555

なし なし なし
exchange601601 ?

573 4

55 — 57

46 — 555

なし なし なし
isLockFree601601 ?

573 4

55 — 57

46 — 555

なし なし なし
load601601 ?

573 4

55 — 57

46 — 555

なし なし なし
or601601 ?

573 4

55 — 57

46 — 555

なし なし なし
store601601 ?

573 4

55 — 57

46 — 555

なし なし なし
sub601601 ?

573 4

55 — 57

46 — 555

なし なし なし
wait601601 ?

573 4

55 — 57

46 — 555

なし なし なし
wake601601 ?

573 4

55 — 57

46 — 555

なし なし なし
xor601601 ?

573 4

55 — 57

46 — 555

なし なし なし

1. Chrome disabled SharedArrayBuffer on January 5, 2018 to help reduce the efficacy of speculative side-channel attacks. This is intended as a temporary measure until other mitigations are in place.

2. Support was removed to mitigate speculative execution side-channel attacks (Windows blog).

3. Support was disabled by default to mitigate speculative execution side-channel attacks (Mozilla Security Blog).

4. From version 57: this feature is behind the javascript.options.shared_memory preference (needs to be set to true). To change preferences in Firefox, visit about:config.

5. From version 46 until version 55 (exclusive): this feature is behind the javascript.options.shared_memory preference (needs to be set to true). To change preferences in Firefox, visit about:config.

互換性ノート

Firefox 48 より前のバージョンでは、最新の API 名とセマンティクスがまだ実装されていませんでした。Firefox バージョン 46 とバージョン 48 の間の変更点は次のとおりです:

  • Atomics.futexWakeOrRequeue() および Atomics.fence() メソッドは完全に削除されました (バグ 1259544バグ 1225028)。
  • Atomics.wait() および Atomics.wake() の以前のメソッド名は Atomics.futexWait()Atomics.futexWake() (バグ 1260910) でした。注記: 古いメソッド名はバージョン 49 以降で削除されました (バグ 1262062)。
  • Atomics.OK, Atomics.TIMEDOUT, Atomics.NOTEQUAL プロパティは削除されました。Atomics.wait() メソッドが文字列の "ok", "timed-out", "not-equal" を返します (バグ 1260835)。
  • Atomics.wake() メソッドの count 引数が変更されました: デフォルト値が 0 ではなく、+Infinity になります (バグ 1253350)。

関連項目

ドキュメントのタグと貢献者

このページの貢献者: yyss, chikoski, hamasaki, YuichiNukiyama, Marsf
最終更新者: yyss,