--- 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 ---
SharedArrayBuffer
对象用来表示一个通用的,固定长度的原始二进制数据缓冲区,类似于 {{jsxref("ArrayBuffer")}} 对象,它们都可以用来在共享内存(shared memory)上创建视图。与 ArrayBuffer
不同的是,SharedArrayBuffer
不能被分离。
请注意,作为对Spectre的响应,所有主流浏览器均默认于2018年1月5日禁用SharedArrayBuffer
。 Chrome在启用了网站隔离功能的平台上的v67中重新启用了该功能,以防止出现Spectre风格的漏洞。
{{EmbedInteractiveExample("pages/js/sharedarraybuffer-constructor.html")}}
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
new SharedArrayBuffer(length)
length
一个大小指定的新 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
对象的APInew
运算符来构造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。 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')}} |
The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.
{{Compat("javascript.builtins.SharedArrayBuffer")}}
A Taste of JavaScript’s New Parallel Primitives – Mozilla Hacks