--- title: SharedArrayBuffer slug: Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer tags: - Constructor - JavaScript - Shared Memory - SharedArrayBuffer - TypesdArrays translation_of: Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer --- <div>{{JSRef}}</div> <p><strong><code>SharedArrayBuffer</code></strong> オブジェクトは、ジェネリックで固定長の生バイナリデータバッファーを表すために使用されます。{{jsxref("ArrayBuffer")}} オブジェクトと似ていますが、これらは共有メモリー上にビューを生成するために使用されます。<code>ArrayBuffer</code> と異なり、<code>SharedArrayBuffer</code> は分離できません。</p> <div class="note"> <p><code>SharedArrayBuffer</code> はすべての主要なブラウザーで 2018 年 1 月 5 日に、<a href="https://meltdownattack.com/">Spectre</a> への対応として無効化されましたので注意してください。Chrome では、Spectre 型脆弱性から保護するためのサイト分離機能が有効にされたプラットフォームにおいて、<a href="https://bugs.chromium.org/p/chromium/issues/detail?id=821270">v67 に再度有効化されています</a>。</p> </div> <div>{{EmbedInteractiveExample("pages/js/sharedarraybuffer-constructor.html")}}</div> <h2 id="構文">構文</h2> <pre class="syntaxbox">new SharedArrayBuffer(length) </pre> <h3 id="パラメーター">パラメーター</h3> <dl> <dt><code>length</code></dt> <dd>array buffer を生成するバイト単位のサイズ。</dd> </dl> <h3 id="戻り値">戻り値</h3> <p>指定したサイズの新しい <code>SharedArrayBuffer</code>。コンテンツは 0 に初期化されている。</p> <h2 id="説明">説明</h2> <h3 id="Allocating_and_sharing_memory" name="Allocating_and_sharing_memory">メモリーの割り当てと共有</h3> <p>クラスター内のあるエージェントから別のエージェント (エージェントとは、ウェブページのメインプログラムまたはその web worker のひとつ) へ、{{jsxref("SharedArrayBuffer")}} オブジェクトを使用してメモリーを共有するために、<code><a href="/ja/docs/Web/API/Worker/postMessage">postMessage</a></code> と <a href="/ja/docs/Web/API/Web_Workers_API/Structured_clone_algorithm">structured cloning</a> を使用します。</p> <p>structured clone アルゴリズムは <code>SharedArrayBuffers</code> と、<code>SharedArrayBuffers</code> にマッピングされた <code>TypedArrays</code> を受け入れます。どちらの場合も <code>SharedArrayBuffer</code> オブジェクトは受信者に転送されて、受信側のエージェントで新たなプライベートの SharedArrayBuffer オブジェクトになります ({{jsxref("ArrayBuffer")}} と同じように)。しかし、2 つの <code>SharedArrayBuffer</code> オブジェクトから参照される共有データブロックは同一のデータブロックであり、あるエージェントによるブロックへの副作用は、結果的に他方のエージェントからも見えます。</p> <pre class="brush: js">var sab = new SharedArrayBuffer(1024); worker.postMessage(sab); </pre> <h3 id="Atomic_操作で共有メモリを更新、同期する">Atomic 操作で共有メモリを更新、同期する</h3> <p>共有メモリーは、worker 内でもメインスレッド内でも同時に生成や更新ができます。システム(CPU や OS、ブラウザー)によっては、変更がすべてのコンテキストに通知されるまでに少々時間がかかります。同期するためには、{{jsxref("Atomics", "atomic", "", 1)}} 操作が必要です。</p> <h3 id="SharedArrayBuffer_オブジェクトを受け付ける_API">SharedArrayBuffer オブジェクトを受け付ける API</h3> <ul> <li>{{domxref("WebGLRenderingContext.bufferData()")}}</li> <li>{{domxref("WebGLRenderingContext.bufferSubData()")}}</li> <li>{{domxref("WebGL2RenderingContext.getBufferSubData()")}}</li> </ul> <h3 id="SharedArrayBuffer_の生成には_new_演算子が必要">SharedArrayBuffer の生成には new 演算子が必要</h3> <p><code>SharedArrayBuffer</code> コンストラクターは、{{jsxref("Operators/new", "new")}} 演算子で呼び出される必要があります。<code>new</code> 演算子なしで関数として <code>SharedArrayBuffer</code> コンストラクターを呼び出すと、{{jsxref("TypeError")}} をスローします。</p> <pre class="brush: js example-bad">var sab = SharedArrayBuffer(1024); // TypeError: calling a builtin SharedArrayBuffer constructor // without new is forbidden</pre> <pre class="brush: js example-good">var sab = new SharedArrayBuffer(1024);</pre> <h2 id="プロパティ">プロパティ</h2> <dl> <dt><code>SharedArrayBuffer.length</code></dt> <dd><code>SharedArrayBuffer</code> コンストラクターの length プロパティの値は 1。</dd> <dt>{{jsxref("SharedArrayBuffer.prototype")}}</dt> <dd>すべての <code>SharedArrayBuffer</code> オブジェクトにプロパティ追加を許可する。</dd> </dl> <h2 id="SharedArrayBuffer_プロトタイプオブジェクト"><code>SharedArrayBuffer</code> プロトタイプオブジェクト</h2> <p>すべての <code>SharedArrayBuffer</code> インスタンスは {{jsxref("SharedArrayBuffer.prototype")}} を継承しています。</p> <h3 id="プロパティ_2">プロパティ</h3> <p>{{page('ja/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer/prototype','プロパティ')}}</p> <h3 id="メソッド">メソッド</h3> <p>{{page('ja/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer/prototype','メソッド')}}</p> <h2 id="仕様">仕様</h2> <table class="standard-table"> <tbody> <tr> <th scope="col">仕様</th> <th scope="col">状態</th> <th scope="col">コメント</th> </tr> <tr> <td>{{SpecName('ESDraft', '#sec-sharedarraybuffer-objects', 'SharedArrayBuffer')}}</td> <td>{{Spec2('ESDraft')}}</td> <td>ES2017 で初期定義。</td> </tr> <tr> <td>{{SpecName('ES8', '#sec-sharedarraybuffer-objects', 'SharedArrayBuffer')}}</td> <td>{{Spec2('ES8')}}</td> <td></td> </tr> </tbody> </table> <h2 id="ブラウザー実装状況">ブラウザー実装状況</h2> <p>{{Compat("javascript.builtins.SharedArrayBuffer")}}</p> <h2 id="関連項目">関連項目</h2> <ul> <li>{{jsxref("Atomics")}}</li> <li>{{jsxref("ArrayBuffer")}}</li> <li><a href="/ja/docs/Web/JavaScript/Typed_arrays">JavaScript typed arrays</a></li> <li><a href="/ja/docs/Web/API/Web_Workers_API">Web Workers</a></li> <li><a href="https://github.com/lars-t-hansen/parlib-simple">parlib-simple </a>– 同期と作業分配抽象化を提供するシンプルなライブラリー</li> <li><a href="https://github.com/tc39/ecmascript_sharedmem/blob/master/TUTORIAL.md">共有メモリー – 簡潔なチュートリアル</a></li> <li> <p><a href="https://dev.mozilla.jp/2016/05/a-taste-of-javascripts-new-parallel-primitives/">JavaScript の並列処理機能を味見してみる</a></p> </li> </ul>