--- title: Atomics slug: Web/JavaScript/Reference/Global_Objects/Atomics tags: - JavaScript - Namespace - Shared Memory - Specifications - 仕様 - 共有メモリ - 名前空間 translation_of: Web/JavaScript/Reference/Global_Objects/Atomics ---
Atomics
オブジェクトは、静的なメソッドとして不可分操作を提供します。これらは {{jsxref("SharedArrayBuffer")}} および {{jsxref("ArrayBuffer")}} オブジェクトで使用されます。
不可分操作は、 Atomics
モジュール上に装備されています。他のグローバルオブジェクトと異なり、 Atomics
はコンストラクターではありません。 new
演算子 を付けて使用したり、 Atomics
オブジェクトを関数として呼び出したりすることはできません。 Atomics
のすべてのプロパティとメソッドは静的です (例えば、{{jsxref("Math")}} オブジェクトの場合と同様です)。
メモリが共有されている場合、複数のスレッドがメモリー内の同じデータを読み書きできます。不可分操作では、予測される値の書き込みと読み込みを保証するため、次の演算が開始される前に現在の演算が完了し、その演算が割り込まれないようにします。
wait()
メソッドと notify()
メソッドは、 Linux の futex ("fast user-space mutex") を原型としており、特定の条件が true になるまで待つ手段を提供します。一般的にはブロッキング構造として使用されます。
true
を返します。上級者だけが使用してください。ok
", "not-equal
", "timed-out
" のいずれかの文字列を返します。呼び出したエージェントで待機が許可されていない場合は、 Error 例外を投げます (ほとんどのブラウザーは、ブラウザーのメインスレッドで wait()
を許可していません)。const sab = new SharedArrayBuffer(1024); const ta = new Uint8Array(sab); ta[0] = 5; Atomics.add(ta, 0, 12); Atomics.load(ta, 0); // 12 Atomics.and(ta, 0, 1); Atomics.load(ta, 0); // 1 Atomics.compareExchange(ta, 0, 5, 12); Atomics.load(ta, 0); // 12 Atomics.exchange(ta, 0, 12); Atomics.load(ta, 0); // 12 Atomics.isLockFree(1); // true Atomics.isLockFree(2); // true Atomics.isLockFree(3); // false Atomics.isLockFree(4); // true Atomics.or(ta, 0, 1); Atomics.load(ta, 0); // 5 Atomics.store(ta, 0, 12); // 12 Atomics.sub(ta, 0, 2); Atomics.load(ta, 0); // 3 Atomics.xor(ta, 0, 1); Atomics.load(ta, 0); // 4
共有された Int32Array
があるとします。
const sab = new SharedArrayBuffer(1024); const int32 = new Int32Array(sab);
読み取りスレッドはスリープ状態で、 0 の位置が 0 である間は待機しています。これが true である限り、スレッドは進みません。しかし、書き込みスレッドが新しい値を格納すると、書き込みスレッドから通知され、新しい値 (123) を返します。
Atomics.wait(int32, 0, 0); console.log(int32[0]); // 123
書き込みスレッドが新しい値を格納し、待機しているスレッドに書き込みが発生したことを通知します。
console.log(int32[0]); // 0; Atomics.store(int32, 0, 123); Atomics.notify(int32, 0, 1);
仕様書 |
---|
{{SpecName('ESDraft', '#sec-atomics-object', 'Atomics')}} |
{{Compat("javascript.builtins.Atomics")}}