Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【JavaScript ECMAScript】Atomics::Atomics.compareExchange静的メソッドの使い方

Atomics.compareExchange()静的メソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

Atomics.compareExchange()メソッドは、JavaScriptにおいて、複数のWeb Worker(スレッド)間で共有されるSharedArrayBuffer内のTypedArray要素に対して、値を比較し、条件が一致した場合にのみ新しい値と原子的に交換を実行するメソッドです。これは、複数のスレッドが同時に同じメモリ領域にアクセスする際に発生しうるデータ競合を防ぎ、データの一貫性を保証するために不可欠な機能を提供します。

具体的には、このメソッドはまず、指定されたTypedArrayの特定のindex位置に存在する現在の値を取得します。次に、その取得した値が、引数として渡されたexpectedValueと厳密に一致するかどうかを比較します。もし両者が一致した場合にのみ、index位置の値をreplacementValueで原子的に更新します。ここでの「原子的に」とは、この比較と交換の一連の操作が、他のどの処理にも中断されることなく、単一の不可分な単位として実行されることを意味します。これにより、他のスレッドが同時に値を変更しようとしても、意図しない中間状態が生じることなく、常に正しい結果が得られます。

メソッドの実行後には、比較が行われる直前のindex位置に格納されていた元の値が返されます。この返り値を利用することで、交換が成功したかどうか、または期待する値と異なっていたために交換がスキップされたかどうかを判断できます。スレッドセーフなカウンターの実装、共有リソースに対するロックの獲得、並行処理における状態フラグの安全な更新など、高度な同期処理を堅牢に実現するために広く利用され、システムの安定性と信頼性を高める上で重要な役割を果たします。

公式リファレンス: Atomics.compareExchange()

構文(syntax)

1const sharedBuffer = new SharedArrayBuffer(4);
2const typedArray = new Int32Array(sharedBuffer);
3typedArray[0] = 5;
4
5const previousValue = Atomics.compareExchange(typedArray, 0, 5, 10);

引数(parameters)

typedArray, index, expectedValue, replacementValue

  • typedArray: Int8Array、Uint8Array、Int16Array、Uint16Array、Int32Array、Uint32Array、BigInt64Array、BigUint64Array のいずれかの型を持つ ArrayBuffer をラップしたビューオブジェクト。アトミック操作の対象となります。
  • index: typedArray 内の要素にアクセスするための数値インデックス。
  • expectedValue: typedArray の指定された index に存在すると期待される値。
  • replacementValue: typedArray の指定された index に replacementValue を設定し、元の値を返します。

戻り値(return)

Number または BigInt

指定された位置の値を、指定された期待値と比較し、期待値と一致した場合に新しい値を設定し、その位置の元の値を返します。期待値と一致しなかった場合は、値を変更せず、元の値を返します。

関連コンテンツ