Movatterモバイル変換


[0]ホーム

URL:


MDN Web Docs

このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。

SharedArrayBuffer

BaselineWidely available *

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

解説

SharedArrayBuffer オブジェクトを使用して、クラスター内のあるエージェントから別のエージェント (エージェントとは、ウェブページのメインプログラムまたはそのウェブワーカーのひとつ) へ、SharedArrayBuffer オブジェクトを使用してメモリーを共有するために、postMessage構造化複製を使用します。

構造化複製アルゴリズムはSharedArrayBuffer と、SharedArrayBuffer にマッピングされた型付き配列を受け入れます。どちらの場合もSharedArrayBuffer オブジェクトは受信者に転送されて、受信側のエージェントで新たなプライベートのSharedArrayBuffer オブジェクトになります(ArrayBuffer と同じように)。しかし、2 つのSharedArrayBuffer オブジェクトから参照される共有データブロックは同一のデータブロックであり、あるエージェントによるブロックへの副作用は、結果的に他方のエージェントからも見えます。

js
const sab = new SharedArrayBuffer(1024);worker.postMessage(sab);

共有メモリーは、ワーカー内でもメインスレッド内でも同時に生成や更新ができます。システム (CPU、OS、ブラウザー) によっては、変更がすべてのコンテキストに通知されるまでに少々時間がかかります。同期するためには、不可分操作が必要です。

SharedArrayBuffer オブジェクトは、以下のように一部のウェブ API で使用されています。

セキュリティの要件

共有メモリーと高解像度タイマーは、Spectre の対策として 2018 年の初めに事実上無効化されました。2020 年には、共有メモリーを再び有効にするために、新しい安全なアプローチが標準化されました。

共有メモリーを使用するには、文書が保護されたコンテキスト内にあり、オリジン同士が分離されている必要があります。Window.crossOriginIsolatedWorkerGlobalScope.crossOriginIsolated のプロパティを使用して、文書のオリジン同士が分離されているかどうかを調べることができます。

js
const myWorker = new Worker("worker.js");if (crossOriginIsolated) {  const buffer = new SharedArrayBuffer(16);  myWorker.postMessage(buffer);} else {  const buffer = new ArrayBuffer(16);  myWorker.postMessage(buffer);}

オリジン同士が分離されている場合、postMessage()SharedArrayBuffer オブジェクトに例外を発生させなくなり、従ってスレッド間での共有メモリーが利用できるようになります。

API の利用可能性

上記のセキュリティ対策の有無により、各種メモリー共有 API の利用可能性は異なります。

  • Atomics オブジェクトは常に利用できます。
  • SharedArrayBuffer オブジェクトは原則として常に利用できますが、残念ながら、ウェブコンテンツとの互換性のために、上記の 2 つのヘッダーが設定されていない限り、グローバルオブジェクトのコンストラクターは隠されます。この制限は将来的に取り除かれることが期待されています。WebAssembly.Memory はまだインスタンスを取得するために使用することができます。
  • 上記の 2 つのヘッダーが設定されていない限り、さまざまなpostMessage() API がSharedArrayBuffer オブジェクトに対して例外を発生することになります。これらが設定された場合は、Window オブジェクトと専用ワーカーのpostMessage() が機能し、メモリーを共有できるようになります。

WebAssembly の共有メモリー

WebAssembly.Memory オブジェクトは、コンストラクターのshared フラグで作成することができます。このフラグをtrue に設定すると、構築されたメモリーオブジェクトはSharedArrayBuffer と同様にpostMessage() を通じてワーカー間で共有でき、メモリーオブジェクトの背後となるbufferSharedArrayBuffer となります。したがって、ワーカー間でSharedArrayBuffer を共有するための上記の要件は、WebAssembly.Memory.Buffer を共有する場合にも当てはまります。

WebAssembly Threads の提案では、新しい不可分命令の集合も定義されています。SharedArrayBuffer とそのメソッドが無条件に有効であるように(そしてスレッド間の共有のみが新しいヘッダー上で制限されます)、 WebAssembly の不可分命令も無条件に許可されます。

SharedArrayBuffer の成長

SharedArrayBuffer オブジェクトはSharedArrayBuffer() コンストラクターを呼び出す際にmaxByteLength オプションを含めることで成長可能にすることができます。また、SharedArrayBuffergrowable およびmaxByteLength プロパティを参照すれば、そのサイズが成長可能かどうかを調べることが可能であり、最大サイズは何であるかがわかります。成長可能なSharedArrayBuffer にはgrow() を呼び出して新しいサイズを割り当てることができます。新しいバイトは 0 に初期化されます。

これらの機能により、SharedArrayBuffer をより効率的に成長させることができます。そうしないと、新しいサイズのバッファーコピーを作成しなければなりません。また、この点において、JavaScript は WebAssembly と同等になります(Wasm のリニアメモリーはWebAssembly.Memory.prototype.grow() でサイズを変更することができます)。

セキュリティ上の理由から、SharedArrayBuffer はサイズを縮小することはできませんが、大きくすることはできます。

コンストラクター

SharedArrayBuffer()

新しいSharedArrayBuffer オブジェクトを生成します。

静的プロパティ

SharedArrayBuffer[Symbol.species]

SharedArrayBuffer のメソッドから返値を構築する際に使用されるコンストラクターを返します。

インスタンスプロパティ

これらのプロパティはSharedArrayBuffer.prototype で定義されており、すべてのSharedArrayBuffer インスタンスで共有されます。

SharedArrayBuffer.prototype.byteLength

配列のサイズ(バイト単位)。これは配列の構築時に設定され、SharedArrayBuffer が成長可能である場合にのみSharedArrayBuffer.prototype.grow() メソッドを使用して変更することができます。

SharedArrayBuffer.prototype.constructor

インスタンスオブジェクトを作成したコンストラクター関数です。SharedArrayBuffer`インスタンスの場合、初期値はSharedArrayBufferコンストラクターです。

SharedArrayBuffer.prototype.growable

読み取り専用です。SharedArrayBuffer が成長可能な場合はtrue を、そうでない場合はfalse を返します。

SharedArrayBuffer.prototype.maxByteLength

読み取り専用で、SharedArrayBuffer が成長できる最大長をバイト数で指定します。これは配列が構築される際に設定され、変更することはできません。

SharedArrayBuffer.prototype[Symbol.toStringTag]

[Symbol.toStringTag] プロパティの初期値は文字列"SharedArrayBuffer" です。このプロパティはObject.prototype.toString() で使用されます。

インスタンスメソッド

SharedArrayBuffer.prototype.grow()

SharedArrayBuffer を指定したサイズ(バイト単位)まで成長させます。

SharedArrayBuffer.prototype.slice()

新しいSharedArrayBuffer を作成し、その中身をこのSharedArrayBufferbegin の位置からend の位置の一つ手前までのバイトをコピーして返します。begin またはend が負の数の場合は、配列の先頭からではなく末尾からの位置で参照します。

新しい SharedArrayBuffer の生成

js
const sab = new SharedArrayBuffer(1024);

SharedArrayBuffer の分割

js
sab.slice(); // SharedArrayBuffer { byteLength: 1024 }sab.slice(2); // SharedArrayBuffer { byteLength: 1022 }sab.slice(-2); // SharedArrayBuffer { byteLength: 2 }sab.slice(0, 1); // SharedArrayBuffer { byteLength: 1 }

WebGL バッファー内での使用

js
const canvas = document.querySelector("canvas");const gl = canvas.getContext("webgl");const buffer = gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER, buffer);gl.bufferData(gl.ARRAY_BUFFER, sab, gl.STATIC_DRAW);

仕様書

Specification
ECMAScript® 2026 Language Specification
# sec-sharedarraybuffer-objects

ブラウザーの互換性

関連情報

Help improve MDN

Learn how to contribute.

This page was last modified on byMDN contributors.


[8]ページ先頭

©2009-2025 Movatter.jp