这是一个实验中的功能
此功能某些浏览器尚在开发中,请参考浏览器兼容性表格以得到在不同浏览器中适合使用的前缀。由于该功能对应的标准文档可能被重新修订,所以在未来版本的浏览器中该功能的语法和行为可能随之改变。
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
WebGLRenderingContext.bufferData()WebGLRenderingContext.bufferSubData()WebGL2RenderingContext.getBufferSubData()
需要 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
SharedArrayBufferconstructor. SharedArrayBuffer.prototype.byteLengthRead 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
SharedArrayBufferwhose contents are a copy of thisSharedArrayBuffer's bytes frombegin, inclusive, up toend, exclusive. If eitherbeginorendis 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
相关链接
AtomicsArrayBuffer- JavaScript typed arrays
- Web Workers
- parlib-simple – a simple library providing synchronization and work distribution abstractions.
- Shared Memory – a brief tutorial
-
A Taste of JavaScript’s New Parallel Primitives – Mozilla Hacks