【初心者向け】JavaScriptのAtomics.load()関数の使い方を解説
JavaScriptのAtomicsオブジェクトは、加算(add)、減算(sub)、論理演算(and、or、xor)、読み込み(load)、書き込み(store)などのアトミック操作を静的メソッドとして提供するオブジェクトです。これらのメソッドは、SharedArrayBufferオブジェクトと組み合わせて使用され、複数スレッド間で共有されるデータに対して安全な操作を実現します。
本記事では、Atomicsオブジェクトが持つload()関数について詳しく解説します。load()関数は、配列内の指定された位置にある値を返す関数です。
Atomics.load()関数とは
Atomics.load()関数は、SharedArrayBuffer上に構築された型付き配列(TypedArray)の指定インデックス位置から、アトミックに(他のスレッドによる割り込みなしで安全に)値を読み取るための関数です。マルチスレッド環境において、データの整合性を保ちながら値を取得したい場合に活用されます。
構文
Atomics.load()関数の基本構文は以下のとおりです。
Atomics.load(typedArray, index)
パラメータ
- typedArray:Int8Array、Uint8Array、Int32Arrayなど、SharedArrayBufferに基づく型付き配列を指定します。
- index:値を読み取りたい配列内の位置(インデックス)を指定します。
戻り値
指定した位置に格納されている値が返されます。
使用例1:add()と組み合わせた基本的な使い方
以下の例では、SharedArrayBufferを作成し、Atomics.add()で値を加算した後に、Atomics.load()でその値を読み取っています。
<html> <head> <title>JavaScript Example</title> </head> <body> <script type="text/javascript"> var arrayBuffer = new SharedArrayBuffer(16); var data = new Uint8Array(arrayBuffer); data[0] = 20; Atomics.add(data, 0, 30); document.write(Atomics.load(data, 0)); </script> </body> </html>
出力
50
この例では、まずdata[0]に20を設定し、次にAtomics.add()によって30を加算しています。その結果、インデックス0の値は50になり、Atomics.load()は50を返します。
使用例2:add()の戻り値との比較
次の例では、Atomics.add()の戻り値と、加算後の値をAtomics.load()で取得した結果を比較しています。
<html>
<head>
<title>JavaScript Example</title>
</head>
<body>
<script type="text/javascript">
var arrayBuffer = new SharedArrayBuffer(16);
var data = new Uint8Array(arrayBuffer);
data[0] = 3;
document.write(Atomics.add(data, 0, 3));
document.write(", "+Atomics.load(data, 0));
</script>
</body>
</html>出力
3, 6
この例では、data[0]の初期値は3です。Atomics.add(data, 0, 3)は「加算前の古い値」である3を返し、その後Atomics.load()で読み取ると、加算後の新しい値6が得られます。このように、Atomics.add()は演算前の値を返す点に注意しましょう。
まとめ
- Atomics.load()は、SharedArrayBufferベースの型付き配列から指定位置の値を安全に読み取る静的メソッドです。
- 引数には対象の型付き配列とインデックスを渡します。
- マルチスレッド処理における競合状態を防ぎ、データの整合性を保つのに役立ちます。
-
JavaScriptの関数プロトタイプとは?仕組みと使い方を解説
JavaScriptで作成されたすべての関数には、JavaScriptエンジンによって自動的にprototypeプロパティが追加されます。このprototypeプロパティはオブジェクトであり、デフォルトではconstructorプロパティを含んでいます。関数のプロトタイプには、以下のようにしてアクセスできます。functionName.prototypeコンストラクタ関数を使ってオブジェクトを生成する場合、このprototypeプロパティを活用することで、同じコンストラクタから作成された複数のオブジェクト間でメソッドやプロパティを効率的に共有することができます。これにより、各インスタンスごとに
-
JavaScriptでのメソッド借用:call()・apply()・bind()の使い方を解説
JavaScriptでは、call()、apply()、bind()という3つのメソッドを使うことで、あるオブジェクトが持つメソッドを別のオブジェクトが「借用」できます。これは、本来そのメソッドを持たないオブジェクトに対して、thisの参照先を差し替えてメソッドを実行できる便利なテクニックです。 3つのメソッドの違い call():引数をカンマ区切りで個別に渡し、即座に関数を実行します。 apply():引数を配列(または配列風オブジェクト)として渡し、即座に関数を実行します。 bind():thisを固定した新しい関数を返すだけで、即座には実行されません。返された関数は後から好きなタイミン