SharedArrayBuffer

这是一个实验中的功能
此功能某些浏览器尚在开发中,请参考浏览器兼容性表格以得到在不同浏览器中适合使用的前缀。由于该功能对应的标准文档可能被重新修订,所以在未来版本的浏览器中该功能的语法和行为可能随之改变。

SharedArrayBuffer 对象用来表示一个泛型的,固定长度的原生二进制数据缓冲区,类似于 ArrayBuffer 对象。但在某种程度上,它们能被用于在共享内存上创建视图。与 ArrayBuffer 不同的是,SharedArrayBuffer 不能被移除。

语法

new SharedArrayBuffer(length)

参数

length
所创建的数组缓冲区的大小,以字节(byte)为单位。

返回值

一个指定大小的新 SharedArrayBuffer 对象,其内容被初始化为0。

描述

分配及共享内存

为了使用 SharedArrayBuffer 对象从一个位于集群中的代理到另一个代理,实现共享内存,需要运用 postMessage 和 structured cloning 。

结构化克隆算法接收 SharedArrayBuffers 与 TypedArrays 被映射到 SharedArrayBuffers 上。在这两种映射下,SharedArrayBuffer 对象会被传递到接收器上,导致在接收代理(正如ArrayBuffer)产生了一个新的私有 SharedArrayBuffer 对象。然而,这两个 SharedArrayBuffer 对象指向的共享数据块其实是同一个,并且在某一代理中的一个块的副作用将最终导致另一个代理具有可见性。

var sab = new SharedArrayBuffer(1024);
worker.postMessage(sab);

在早期版本的特性中,结构化克隆期间 SharedArrayBuffers 需要被精确转化。然而,从HTML的意义上来讲,SharedArrayBuffers 并非一个 Transferable object。因此,如果一个 SharedArrayBuffer 对象位于转化队列,postMessage 将会抛出 DataCloneError 或 一个警告:

var sab = new SharedArrayBuffer(1024);
worker.postMessage(sab, [sab]);
// SharedArrayBuffer 不能位于转化队列中

通过原子操作更新及同步来共享内存

共享内存能被同时创建和更新于工作者线程或主线程。依赖于系统(CPU,操作系统,浏览器),变化传递给环境需要一段时间。需要通过 atomic 操作来进行同步。

接受 SharedArrayBuffer 对象的API

需要 new 运算符来构造

SharedArrayBuffer 需要 new 运算符来构造一个构造函数. 作为函数来调用一个 SharedArrayBuffer 构造函数时,如果不用 new 运算符,将会抛出一个 TypeError 异常。

var sab = SharedArrayBuffer(1024);
// TypeError: calling a builtin SharedArrayBuffer constructor
// 必须用 new 来构造
var sab = new SharedArrayBuffer(1024);

属性

SharedArrayBuffer.length
The 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
Draft Initial definition.
ECMAScript 2017 Draft (ECMA-262) Draft  

浏览器兼容性

Feature Chrome Edge Firefox (Gecko) Internet Explorer Opera Safari
Basic support 未实现 [2] 未实现 52 (52) [1] 未实现 未实现 未实现
slice() 未实现 未实现 52 (52) [1] 未实现 未实现 未实现
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support 未实现 未实现 52.0 (52) [1] 未实现 未实现 未实现
slice() 未实现 未实现 52.0 (52) [1] 未实现 未实现 未实现

[1]  从Firefox46直到51版本, 该特性被首选项设置为不可用。在 about:config 下将 javascript.options.shared_memory 置为 true。

[2] 正在开发中,运行时需要以下标记: --js-flags=--harmony-sharedarraybuffer --enable-blink-feature=SharedArrayBuffer

相关链接

文档标签和贡献者