MDN wants to talk to developers like you: https://qsurvey.mozilla.com/s3/8d22564490d8

SharedArrayBuffer

これは実験段階の機能です。
この機能は複数のブラウザで開発中の状態にあります。互換性テーブルをチェックしてください。また、実験段階の機能の構文と挙動は、仕様変更に伴い各ブラウザの将来のバージョンで変更になる可能性があることに注意してください。

SharedArrayBuffer オブジェクトは、ジェネリックで固定長の生バイナリデータバッファを表すために使用されます。ArrayBuffer オブジェクトと似ていますが、これらは共有メモリ上にビューを生成するために使用されます。ArrayBuffer と異なり、 SharedArrayBuffer は分離できません。

構文

new SharedArrayBuffer(length)

パラメーター

length
array buffer を生成するバイト単位のサイズ。

戻り値

指定したサイズの新しい SharedArrayBuffer。コンテンツは 0 に初期化されている。

説明

ArrayBuffer vs SharedArrayBuffer

JavaScript は、ArrayBufferSharedArrayBuffer オブジェクトを提供しています。これらは、次のように生成されます:

var ab = new ArrayBuffer(1024);
var sab = new SharedArrayBuffer(1024);

Web コンテンツは、バックグラウンドスレッドでスクリプトを実行するために、 Web Worker を使用します。worker からのデータの送受信は、postMessage() メソッドによって行われ、transferable object と呼ばれる特定の種類のオブジェクトは、あるコンテキストからほかのコンテキストにコピー操作なしのハイパフォーマンスで転送されます。

メインアプリから worker スクリプトに ArrayBuffer を転送する場合、オリジナルの ArrayBuffer はクリアされて使用できなくなります。そのコンテンツは(文字通り) worker コンテクストに転送されます。

var ab = new ArrayBuffer(1024);
var uInt8Array = new Uint8Array(ab);
for (var i = 0; i < uInt8Array.length; ++i) {
  uInt8Array[i] = i;
}

var worker = new Worker("worker.js");

// 転送前
console.log(uInt8Array.byteLength); // 1024

worker.postMessage(uInt8Array.buffer, [uInt8Array.buffer]);

// 転送後
console.log(uInt8Array.byteLength); // 0

SharedArrayBuffer の場合、同じ postMessage() を呼び出して転送することで、worker とこのメモリをシェアできます。

var sab = new SharedArrayBuffer(1024);

// 転送前
console.log(sab.byteLength); // 1024

worker.postMessage(sab, [sab]);

// 転送後
console.log(sab.byteLength); // 1024

Atomic 操作で共有メモリを更新、同期する

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

SharedArrayBuffer オブジェクトを受け付ける API

生成には new 演算子が必要

SharedArrayBuffer コンストラクタは、new 演算子で呼び出される必要があります。new 演算子なしで関数として SharedArrayBuffer コンストラクタを呼び出すと、TypeError をスローします。

var sab = SharedArrayBuffer(1024);
// TypeError: calling a builtin SharedArrayBuffer constructor 
// without new is forbidden
var sab = new SharedArrayBuffer(1024);

プロパティ

SharedArrayBuffer.length
SharedArrayBuffer コンストラクタの length プロパティの値は 1。
SharedArrayBuffer.prototype
すべての SharedArrayBuffer オブジェクトにプロパティ追加を許可する。

SharedArrayBuffer プロトタイプオブジェクト

すべての SharedArrayBuffer インスタンスは SharedArrayBuffer.prototype を継承しています。

プロパティ

SharedArrayBuffer.prototype.constructor
Specifies the function that creates an object's prototype. The initial value is the standard built-in SharedArrayBuffer constructor.
SharedArrayBuffer.prototype.byteLength Read only
The size, in bytes, of the array. This is established when the array is constructed and cannot be changed. Read only.

メソッド

SharedArrayBuffer.prototype.slice(begin, end)
Returns a new SharedArrayBuffer whose contents are a copy of this SharedArrayBuffer's bytes from begin, inclusive, up to end, exclusive. If either begin or end is negative, it refers to an index from the end of the array, as opposed to from the beginning.

仕様

仕様 状態 コメント
ECMAScript Shared Memory and Atomics
SharedArrayBuffer の定義
ドラフト 初期定義。

ブラウザ実装状況

機能 Chrome Edge Firefox (Gecko) Internet Explorer Opera Safari
基本サポート 未サポート [2] 未サポート 46 (46) [1]
47 (47)
未サポート 未サポート 未サポート
slice() 未サポート 未サポート 未サポート 未サポート 未サポート 未サポート
機能 Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
基本サポート 未サポート 未サポート 46.0 (46) [1] 未サポート 未サポート 未サポート
slice() 未サポート 未サポート 未サポート 未サポート 未サポート 未サポート

[1] この機能は、環境設定で無効になっています。about:config で、javascript.options.shared_memorytrue に設定してください。

[2] この実装は開発中で、これらのランタイムフラグが必要です:--js-flags=--harmony-sharedarraybuffer --enable-blink-feature=SharedArrayBuffer

関連項目

ドキュメントのタグと貢献者

 このページの貢献者: YuichiNukiyama
 最終更新者: YuichiNukiyama,