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.
Syntax
new SharedArrayBuffer(length)
Parameters
- length
- The size, in bytes, of the array buffer to create.
Return value
A new SharedArrayBuffer object of the specified size. Its contents are initialized to 0.
Description
Allocating and sharing memory
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);
Updating and synchronizing shared memory with Atomic operations
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.
APIs accepting SharedArrayBuffer objects
- WebGLRenderingContext.bufferData()
- WebGLRenderingContext.bufferSubData()
- WebGL2RenderingContext.getBufferSubData()
Constructing is required with new operator
SharedArrayBuffer constructors require 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);
Properties
- SharedArrayBuffer.length
- The SharedArrayBufferconstructor's length property whose value is 1.
- SharedArrayBuffer.prototype
- Allows the addition of properties to all SharedArrayBufferobjects.
SharedArrayBuffer prototype object
All SharedArrayBuffer instances inherit from SharedArrayBuffer.prototype.
Properties
- 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.
Methods
- 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.
Specifications
| Specification | Status | Comment | 
|---|---|---|
| ECMAScript Latest Draft (ECMA-262) The definition of 'SharedArrayBuffer' in that specification. | Living Standard | Initial definition in ES2017. | 
| ECMAScript 2017 (ECMA-262) The definition of 'SharedArrayBuffer' in that specification. | Standard | 
Browser compatibility
| Feature | Chrome | Edge | Firefox (Gecko) | Internet Explorer | Opera | Safari | 
|---|---|---|---|---|---|---|
| Basic support | 60 [2] | No support | 55 (55) [1] | No support | No support | 10.1 | 
| slice() | 60 [2] | No support | 52 (52) [1] | No support | No support | 10.1 | 
| SAB in DataView | No support | 53 (53) [1] | No support | No support | 10.1 | 
| Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile | 
|---|---|---|---|---|---|---|
| Basic support | No support | No support | 55.0 (55) [1] | No support | No support | 10.1 | 
| slice() | No support | No support | 52.0 (52) [1] | No support | No support | 10.1 | 
| SAB in DataView | No support | No support | 53.0 (53) [1] | No support | No support | 10.1 | 
[1] Enabled by default in Firefox 55. In Firefox version 46 until version 54, this feature is disabled by a preference setting (in about:config, set javascript.options.shared_memory to true). 
[2] Before version 60, it was enabled through flags : --js-flags=--harmony-sharedarraybuffer --enable-blink-feature=SharedArrayBuffer
See also
- Atomics
- ArrayBuffer
- 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