The SharedArrayBuffer object is used to represent a generic, fixed-length raw binary data buffer, similar to the ArrayBuffer object, but in a way that they can be used to create views on shared memory. Unlike an ArrayBuffer, a SharedArrayBuffer cannot become detached.
Note that SharedArrayBuffer has been disabled by default in all major vendors on 5 January, 2018 in response to Spectre.
new SharedArrayBuffer(length)
lengthA new SharedArrayBuffer object of the specified size. Its contents are initialized to 0.
To share memory using SharedArrayBuffer objects from one agent in the cluster to another (an agent is either the web page’s main program or one of its web workers), postMessage and structured cloning is used.
The structured clone algorithm accepts SharedArrayBuffers and TypedArrays mapped onto SharedArrayBuffers. In both cases, the SharedArrayBuffer object is transmitted to the receiver resulting in a new, private SharedArrayBuffer object in the receiving agent (just as for ArrayBuffer). However, the shared data block referenced by the two SharedArrayBuffer objects is the same data block, and a side effect to the block in one agent will eventually become visible in the other agent.
var sab = new SharedArrayBuffer(1024); worker.postMessage(sab);
Shared memory can be created and updated simultaneously in workers or the main thread. Depending on the system (the CPU, the OS, the Browser) it can take a while until the change is propagated to all contexts. To synchronize, atomic operations are needed.
SharedArrayBuffer objectsWebGLRenderingContext.bufferData()WebGLRenderingContext.bufferSubData()WebGL2RenderingContext.getBufferSubData()new operatorSharedArrayBuffer constructors are required to be constructed with a new operator. Calling a SharedArrayBuffer constructor as a function without new will throw a TypeError.
var sab = SharedArrayBuffer(1024); // TypeError: calling a builtin SharedArrayBuffer constructor // without new is forbidden
var sab = new SharedArrayBuffer(1024);
SharedArrayBuffer.lengthSharedArrayBuffer constructor's length property whose value is 1.SharedArrayBuffer.prototypeSharedArrayBuffer objects.SharedArrayBuffer prototype objectAll SharedArrayBuffer instances inherit from SharedArrayBuffer.prototype.
SharedArrayBuffer constructor.SharedArrayBuffer.prototype.byteLength Read only
SharedArrayBuffer.prototype.slice(begin, end)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.| Specification | Status | Comment |
|---|---|---|
| ECMAScript Latest Draft (ECMA-262) The definition of 'SharedArrayBuffer' in that specification. | Draft | Initial definition in ES2017. |
| ECMAScript 2017 (ECMA-262) The definition of 'SharedArrayBuffer' in that specification. | Standard |
| Feature | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
|---|---|---|---|---|---|---|
| Basic support | 601 | No2 |
55 — 57 46 — 555 |
No | No | 10.1 —? |
SharedArrayBuffer in DataView
|
601 | No2 |
55 — 57 46 — 555 |
No | No | 10.1 —? |
prototype |
601 | No2 |
55 — 57 46 — 555 |
No | No | 10.1 —? |
byteLength |
601 | No2 |
55 — 57 46 — 555 |
No | No | 10.1 —? |
slice |
601 | No2 |
55 — 57 46 — 555 |
No | No | 10.1 —? |
| Feature | Android webview | Chrome for Android | Edge mobile | Firefox for Android | Opera Android | iOS Safari | Samsung Internet |
|---|---|---|---|---|---|---|---|
| Basic support | 601 | 601 | ? |
55 — 57 46 — 555 |
No | No | ? |
SharedArrayBuffer in DataView
|
601 | 601 | ? |
55 — 57 46 — 555 |
No | No | ? |
prototype |
601 | 601 | ? |
55 — 57 46 — 555 |
No | No | ? |
byteLength |
601 | 601 | ? |
55 — 57 46 — 555 |
No | No | ? |
slice |
601 | 601 | ? |
55 — 57 46 — 555 |
No | No | ? |
1. Chrome disabled SharedArrayBuffer on January 5, 2018 to help reduce the efficacy of speculative side-channel attacks. This is intended as a temporary measure until other mitigations are in place.
2. Support was removed to mitigate speculative execution side-channel attacks (Windows blog).
3. Support was disabled by default to mitigate speculative execution side-channel attacks (Mozilla Security Blog).
4. From version 57: this feature is behind the javascript.options.shared_memory preference (needs to be set to true). To change preferences in Firefox, visit about:config.
5. From version 46 until version 55 (exclusive): this feature is behind the javascript.options.shared_memory preference (needs to be set to true). To change preferences in Firefox, visit about:config.
AtomicsArrayBufferA Taste of JavaScript’s New Parallel Primitives – Mozilla Hacks
© 2005–2018 Mozilla Developer Network and individual contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer