SharedArrayBuffer
BaselineWidely available *
This feature is well established and works across many devices and browser versions. It’s been available across browsers since December 2021.
* Some parts of this feature may have varying levels of support.
DasSharedArrayBuffer
-Objekt wird verwendet, um einen generischen Rohdatenpuffer darzustellen, ähnlich demArrayBuffer
-Objekt, jedoch auf eine Weise, dass darauf Ansichten des gemeinsamen Speichers erstellt werden können. EinSharedArrayBuffer
ist keinTransferable Object, im Gegensatz zu einemArrayBuffer
, das übertragbar ist.
Beschreibung
Um Speicher mittelsSharedArrayBuffer
-Objekten von einem Agenten im Cluster zum anderen zu teilen (ein Agent ist entweder das Hauptprogramm der Webseite oder einer ihrer Web Worker), werdenpostMessage
und dasstrukturierte Klonen verwendet.
Der Algorithmus für strukturiertes Klonen akzeptiertSharedArrayBuffer
-Objekte und typisierte Arrays, die aufSharedArrayBuffer
-Objekte abgebildet sind. In beiden Fällen wird dasSharedArrayBuffer
-Objekt an den Empfänger übertragen, was zu einem neuen, privatenSharedArrayBuffer
-Objekt im empfangenden Agenten führt (genauso wie beimArrayBuffer
). Der gemeinsam genutzte Datenblock, auf den sich die beidenSharedArrayBuffer
-Objekte beziehen, ist jedoch derselbe Datenblock, und eine Auswirkung auf den Block bei einem Agenten wird schließlich im anderen Agenten sichtbar.
const sab = new SharedArrayBuffer(1024);worker.postMessage(sab);
Gemeinsamer Speicher kann gleichzeitig in Workern oder im Haupt-Thread erstellt und aktualisiert werden. Abhängig vom System (der CPU, dem Betriebssystem, dem Browser) kann es eine Weile dauern, bis die Änderung in allen Kontexten propagiert wird. Zur Synchronisierung sindatomare Operationen erforderlich.
SharedArrayBuffer
-Objekte werden von einigen Web-APIs verwendet, wie z.B.:
Sicherheitsanforderungen
Gemeinsamer Speicher und hochauflösende Timer wurden Anfang 2018wirksam deaktiviert im Lichte vonSpectre. Im Jahr 2020 wurde ein neuer, sicherer Ansatz standardisiert, um den gemeinsamen Speicher wieder zu aktivieren.
Um gemeinsamen Speicher zu verwenden, muss Ihr Dokument in einemsicheren Kontext undcross-origin isoliert sein. Sie können die EigenschaftenWindow.crossOriginIsolated
undWorkerGlobalScope.crossOriginIsolated
verwenden, um zu überprüfen, ob das Dokument cross-origin isoliert ist:
const myWorker = new Worker("worker.js");if (crossOriginIsolated) { const buffer = new SharedArrayBuffer(16); myWorker.postMessage(buffer);} else { const buffer = new ArrayBuffer(16); myWorker.postMessage(buffer);}
Wenn es cross-origin isoliert ist, wirftpostMessage()
nicht mehr fürSharedArrayBuffer
-Objekte, und gemeinsamer Speicher über Threads hinweg ist daher verfügbar.
API-Verfügbarkeit
Je nachdem, ob die oben genannten Sicherheitsmaßnahmen ergriffen werden, sind die verschiedenen APIs zur Speicherfreigabe unterschiedlich verfügbar:
- Das
Atomics
-Objekt ist immer verfügbar. SharedArrayBuffer
-Objekte sind prinzipiell immer verfügbar, aber leider ist der Konstruktor im globalen Objekt verborgen, es sei denn, die beiden oben genannten Header sind gesetzt, um die Kompatibilität mit Webinhalten zu gewährleisten. Es besteht Hoffnung, dass diese Einschränkung in Zukunft entfernt werden kann.WebAssembly.Memory
kann weiterhin verwendet werden, um eine Instanz zu erhalten.- Wenn die oben genannten beiden Header nicht gesetzt sind, werfen die verschiedenen
postMessage()
-APIs fürSharedArrayBuffer
-Objekte einen Fehler. Wenn sie gesetzt sind, funktioniertpostMessage()
aufWindow
-Objekten und dedizierten Workern und erlaubt die Speicherfreigabe.
WebAssembly gemeinsamer Speicher
WebAssembly.Memory
-Objekte können mit demshared
-Konstruktor-Flag erstellt werden. Wenn dieses Flag auftrue
gesetzt ist, kann das konstruierteMemory
-Objekt zwischen Workern überpostMessage()
geteilt werden, ähnlich wieSharedArrayBuffer
, und der unterstützendebuffer
desMemory
-Objekts ist einSharedArrayBuffer
. Daher gelten die oben genannten Anforderungen für das Teilen einesSharedArrayBuffer
zwischen Workern auch für das Teilen einesWebAssembly.Memory
.
Der WebAssembly Threads-Vorschlag definiert auch eine neue Reihe vonatomaren Anweisungen. Genau wieSharedArrayBuffer
und seine Methoden bedingungslos aktiviert sind (und nur das Teilen zwischen Threads auf den neuen Headers basiert), sind die WebAssembly atomaren Anweisungen ebenfalls bedingungslos erlaubt.
Wachstum von SharedArrayBuffers
SharedArrayBuffer
-Objekte können durch die Angabe dermaxByteLength
-Option beim Aufruf desSharedArrayBuffer()
-Konstruktors erweiterbar gemacht werden. Sie können abfragen, ob einSharedArrayBuffer
erweiterbar ist und wie groß seine maximale Größe ist, indem Sie seinegrowable
- undmaxByteLength
-Eigenschaften abfragen. Sie können einem erweiterbarenSharedArrayBuffer
mit einem Aufruf vongrow()
eine neue Größe zuweisen. Neue Bytes werden auf 0 initialisiert.
Diese Funktionen machen das Wachstum vonSharedArrayBuffer
s effizienter — andernfalls müssen Sie eine Kopie des Puffers mit neuer Größe erstellen. Es gleicht auch JavaScript in diesem Punkt mit WebAssembly an (Wasm-Linear-Speicher kann mitWebAssembly.Memory.prototype.grow()
vergrößert werden).
Aus Sicherheitsgründen könnenSharedArrayBuffer
s nicht verkleinert werden, sondern nur wachsen.
Konstruktor
SharedArrayBuffer()
Erstellt ein neues
SharedArrayBuffer
-Objekt.
Statische Eigenschaften
SharedArrayBuffer[Symbol.species]
Gibt den Konstruktor zurück, der verwendet wird, um Rückgabewerte von
SharedArrayBuffer
-Methoden zu konstruieren.
Instanzeigenschaften
Diese Eigenschaften sind aufSharedArrayBuffer.prototype
definiert und werden von allenSharedArrayBuffer
-Instanzen geteilt.
SharedArrayBuffer.prototype.byteLength
Die Größe in Bytes des Arrays. Dies wird beim Erstellen des Arrays festgelegt und kann nur geändert werden, wenn das
SharedArrayBuffer
erweiterbar ist, mittels derSharedArrayBuffer.prototype.grow()
-Methode.SharedArrayBuffer.prototype.constructor
Die Konstrukturfunktion, die das Instanzobjekt erstellt hat. Für
SharedArrayBuffer
-Instanzen ist der Anfangswert derSharedArrayBuffer
-Konstruktor.SharedArrayBuffer.prototype.growable
Schreibgeschützt. Gibt
true
zurück, wenn dasSharedArrayBuffer
vergrößert werden kann, oderfalse
, wenn nicht.SharedArrayBuffer.prototype.maxByteLength
Die schreibgeschützte maximale Länge in Bytes, auf die das
SharedArrayBuffer
vergrößert werden kann. Dies wird beim Erstellen des Arrays festgelegt und kann nicht geändert werden.SharedArrayBuffer.prototype[Symbol.toStringTag]
Der anfängliche Wert der
[Symbol.toStringTag]
-Eigenschaft ist der String"SharedArrayBuffer"
. Diese Eigenschaft wird inObject.prototype.toString()
verwendet.
Instanzmethoden
SharedArrayBuffer.prototype.grow()
Vergrößert das
SharedArrayBuffer
auf die angegebene Größe in Bytes.SharedArrayBuffer.prototype.slice()
Gibt ein neues
SharedArrayBuffer
zurück, dessen Inhalt eine Kopie der Bytes diesesSharedArrayBuffer
ist, vonbegin
(einschließlich) bisend
(ausschließlich). Wennbegin
oderend
negativ sind, beziehen sie sich auf einen Index vom Ende des Arrays, anstatt vom Anfang.
Beispiele
Erstellen eines neuen SharedArrayBuffer
const sab = new SharedArrayBuffer(1024);
Schneiden des SharedArrayBuffer
sab.slice(); // SharedArrayBuffer { byteLength: 1024 }sab.slice(2); // SharedArrayBuffer { byteLength: 1022 }sab.slice(-2); // SharedArrayBuffer { byteLength: 2 }sab.slice(0, 1); // SharedArrayBuffer { byteLength: 1 }
Verwendung in einem WebGL-Puffer
const canvas = document.querySelector("canvas");const gl = canvas.getContext("webgl");const buffer = gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER, buffer);gl.bufferData(gl.ARRAY_BUFFER, sab, gl.STATIC_DRAW);
Spezifikationen
Specification |
---|
ECMAScript® 2026 Language Specification # sec-sharedarraybuffer-objects |
Browser-Kompatibilität
Siehe auch
Atomics
ArrayBuffer
- JavaScript typisierte Arrays Leitfaden
- Web Workers
- Gemeinsamer Speicher – ein kurzes Tutorial im TC39 ecmascript-sharedmem-Vorschlag
- Ein Vorgeschmack auf JavaScripts neue parallele Primitive auf hacks.mozilla.org (2016)
- COOP und COEP erklärt vom Chrome-Team (2020)
Cross-Origin-Opener-Policy
Cross-Origin-Embedder-Policy
Cross-Origin-Resource-Policy
Window.crossOriginIsolated
undWorkerGlobalScope.crossOriginIsolated
- SharedArrayBuffer-Updates in Android Chrome 88 und Desktop Chrome 92 auf developer.chrome.com (2021)
MDN-Feedback-Box
Diese Seite wurde automatisch aus dem Englischen übersetzt.