--- title: SharedArrayBuffer slug: Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer tags: - ArrayBuffer - Service Worker - Shared Memory - SharedArrayBuffer - TypedArrays - Web Worker - Worker - 共享内存 - 实验的 - 构造函数 translation_of: Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer ---
{{JSRef}}

SharedArrayBuffer 对象用来表示一个通用的,固定长度的原始二进制数据缓冲区,类似于 {{jsxref("ArrayBuffer")}} 对象,它们都可以用来在共享内存(shared memory)上创建视图。与 ArrayBuffer 不同的是,SharedArrayBuffer 不能被分离。

请注意,作为对Spectre的响应,所有主流浏览器均默认于2018年1月5日禁用SharedArrayBuffer。 Chrome在启用了网站隔离功能的平台上的v67中重新启用了该功能,以防止出现Spectre风格的漏洞。

{{EmbedInteractiveExample("pages/js/sharedarraybuffer-constructor.html")}}

语法

new SharedArrayBuffer(length)

参数

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

返回值

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

描述

分配及共享内存

为了将一个{{jsxref("SharedArrayBuffer")}} 对象从一个用户代理共享到另一个用户代理(另一个页面的主进程或者当前页面的一个 worker )从而实现共享内存,我们需要运用 postMessage 和结构化克隆算法( structured cloning )。

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

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

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

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

接受 SharedArrayBuffer 对象的API

需要 new 运算符来构造

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

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

属性

SharedArrayBuffer.length
SharedArrayBuffer 构造函数的 length 属性值为1。 
{{jsxref("SharedArrayBuffer.prototype")}}
允许所有 SharedArrayBuffer 对象的附加属性。

SharedArrayBuffer 原型对象

所有 SharedArrayBuffer 实例继承自 {{jsxref("SharedArrayBuffer.prototype")}}。

属性

{{page('zh-CN/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer/prototype','Properties')}}

方法

{{page('zh-CN/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer/prototype','Methods')}}

规范

规范 状态 备注
{{SpecName('ESDraft', '#sec-sharedarraybuffer-objects', 'SharedArrayBuffer')}} {{Spec2('ESDraft')}} Initial definition in ES2017.
{{SpecName('ES8', '#sec-sharedarraybuffer-objects', 'SharedArrayBuffer')}} {{Spec2('ES8')}}

浏览器兼容性

{{Compat("javascript.builtins.SharedArrayBuffer")}}

相关链接