Widely available すべての主要ブラウザで対応済み。安心して使用可能。

概要

SharedArrayBuffer はスレッド(Worker)間でメモリを共有し、Atomics はそのメモリに対する不可分操作(排他制御)を提供します。

対応ブラウザ

機能 デスクトップ モバイル
Chrome
Edge
Firefox
Safari
Chrome Android
Safari iOS
68
79
78
15.2
89
15.2
Atomics.Atomic operations on non shared buffers

非共有 `ArrayBuffer` オブジェクトに対するアトミック操作

79

Atomics.add() は静的メソッドで、配列内の指定した位置の値に加算して、その位置の古い値を返します。これは不可分操作で、修正された値が書き戻されるまで、他の書き込みが起こらないことを保証します。

68
79
78
15.2
89
15.2

Atomics.and() は静的メソッドで、配列内の指定した位置の値に指定した値でビット単位の AND を計算し、その位置の古い値を返します。これは不可分操作で、修正された値が書き戻されるまで、他の書き込みが起こらないことを保証します。

68
79
78
15.2
89
15.2

Atomics.compareExchange() は静的メソッドで、指定された値を配列内の指定した位置に格納し、その値を返します。これは、その位置での古い値が、期待された値と同じであったかどうかを返すものです。これは不可分操作で、変更された値が書き戻されるまで、他の書き込みが行われないことが保証されます。

68
79
78
15.2
89
15.2

Atomics.exchange() は静的メソッドで、指定された値を配列内の指定した位置と交換し、その値を返します。これは不可分操作で、古い値を読み取ってから新しい値を書き込むまでの間に他の物が書き込まないことを保証します。

68
79
78
15.2
89
15.2

Atomics.isLockFree() は静的メソッドで、 Atomics のメソッドが、要素のバイト数が指定された大きさである型付き配列に適用された場合、ロックまたは不可分のハードウェア操作を使用するかどうかを見極めるために使用されます。これは、最適化のためのプリミティブとして意図されており、高性能アルゴリズムが、クリティカルセクションでロックを使用するか、不可分操作を使用するかを決定できるようにするためのものです。不可分プリミティブがロックフリーでない場合、アルゴリズムが自分自身でロックを提供した方が効率的な場合が多いです。

68
79
78
15.2
89
15.2

静的な Atomics.load() メソッドは、配列内の指定された位置の値を返します。

68
79
78
15.2
89
15.2

Atomics.notify() は静的メソッドで、待ち行列で休眠状態にあるエージェントに通知します。

68
79
78
15.2
89
15.2

Atomics.or() は静的メソッドで、配列内の指定した位置の値に指定した値でビット単位の OR を計算し、その位置にあった古い値を返します。これは不可分操作で、修正された値が書き戻されるまで、他の書き込みが起こらないことを保証します。

68
79
78
15.2
89
15.2

Atomics.store() は静的メソッドで、指定された値を配列内の指定した位置に格納し、その値を返します。

68
79
78
15.2
89
15.2

Atomics.sub() は静的メソッドで、配列内の指定した位置の値から減算して、その場所にあった古い値を返します。この不可分操作は、修正された値が書き戻されるまで、ほかの書き込みが発生しないことを保証します。

68
79
78
15.2
89
15.2

Atomics.wait() 静的メソッドは、共有メモリー位置に指定された値が含まれていることを確認し、含まれている場合は、覚醒通知またはタイムアウトを待つために休眠します。メモリー位置が指定された値と一致しない場合は "not-equal"、 Atomics.notify() によって覚醒した場合は "ok"、タイムアウトが切れた場合は "timed-out" という文字列を返します。

68
79
78
15.2
89
15.2

Atomics.xor() は静的メソッドで、配列内の指定した位置にある指定された値とのビット単位の XOR を計算し、その位置にあった古い値を返します。これは不可分操作であり、変更された値が書き戻されるまで他の書き込みが行われないことが保証されます。

68
79
78
15.2
89
15.2
DataView.DataView.sharedarraybuffer support

`SharedArrayBuffer` がバッファとして受け入れられました

68
79
79
15.2
89
15.2
その他

SharedArrayBuffer オブジェクトは、一般的な、生のバイナリーデータバッファーを表すために使用されます。ArrayBuffer オブジェクトと似ていますが、こちらは共有メモリー上にビューを生成するために使用されます。SharedArrayBuffer は移譲可能オブジェクトではありません。この点では ArrayBuffer が移譲可能であるのとは異なります。

68
79
79
15.2
89
15.2
ビルトインオブジェクト

SharedArrayBuffer[Symbol.species] アクセサープロパティは、SharedArrayBuffer の各メソッドから返される値を作成するために使用されるコンストラクター(種)を返します。

68
79
79
15.2
89
15.2

SharedArrayBuffer() コンストラクターは SharedArrayBuffer オブジェクトを生成します。

68
79
79
15.2
89
15.2

byteLength アクセサープロパティは、SharedArrayBuffer の長さをバイト単位で表します。

68
79
79
15.2
89
15.2

slice() は SharedArrayBuffer インスタンスのメソッドで、この SharedArrayBuffer の先頭位置 (含む) から末尾位置 (含まない) までのバイトのコピーである新しい SharedArrayBuffer を返します。開始位置または終わりが負の場合、それは配列の末尾からのインデックスを参照します。

68
79
79
15.2
89
15.2
1+対応 (バージョン) 未対応 注釈あり サブ機能の解説は MDN Web Docs (CC BY-SA 2.5)
注釈 1件
実装メモ
  • Safari 16.4以前では、`Atomics`はCOOP/COEPの後ろにゲートされています。詳しくは、COOPとCOEPを使ってウェブサイトを「クロスオリジン隔離」するをご覧ください。
注釈 1件
実装メモ
  • iOS16.4以前のSafariでは、`Atomics`はCOOP/COEPの後ろにゲートされています。詳しくは、COOPとCOEPを使ってウェブサイトを「クロスオリジン隔離」するをご覧ください。

基本構文

JAVASCRIPT
const sab = new SharedArrayBuffer(1024);
const int32 = new Int32Array(sab);

// Share among workers
worker.postMessage(sab);

// Atomic operations
Atomics.add(int32, 0, 5);
Atomics.load(int32, 0); // 5

ライブデモ

Create a SharedArrayBuffer

Allocate shared memory and inspect it through typed array views.

JavaScript
出力
「実行」ボタンを押してください

Share one buffer across views

Read the same shared memory through two typed arrays.

JavaScript
出力
「実行」ボタンを押してください

Use Atomics with shared memory

Apply an atomic add operation on a shared typed array.

JavaScript
出力
「実行」ボタンを押してください

実務での使いどころ

  • SharedArrayBuffer and Atomics の活用

    スレッド間で共有可能なメモリと不可分操作。SharedArrayBuffer と Atomics を提供。

注意点

  • 特になし。すべての主要ブラウザで安定して動作する。

アクセシビリティ

  • JavaScript による動的更新時は、aria-live リージョンで変更をスクリーンリーダーに通知する。

Powered by web-features