Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.
SharedArrayBuffer
Baseline Widely available *
This feature is well established and works across many devices and browser versions. It’s been available across browsers since Dezember 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.
In diesem Artikel
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.Memorykann 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 vonSharedArrayBuffers 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önnenSharedArrayBuffers 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.byteLengthDie Größe in Bytes des Arrays. Dies wird beim Erstellen des Arrays festgelegt und kann nur geändert werden, wenn das
SharedArrayBuffererweiterbar ist, mittels derSharedArrayBuffer.prototype.grow()-Methode.SharedArrayBuffer.prototype.constructorDie Konstrukturfunktion, die das Instanzobjekt erstellt hat. Für
SharedArrayBuffer-Instanzen ist der Anfangswert derSharedArrayBuffer-Konstruktor.SharedArrayBuffer.prototype.growableSchreibgeschützt. Gibt
truezurück, wenn dasSharedArrayBuffervergrößert werden kann, oderfalse, wenn nicht.SharedArrayBuffer.prototype.maxByteLengthDie schreibgeschützte maximale Länge in Bytes, auf die das
SharedArrayBuffervergröß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
SharedArrayBufferauf die angegebene Größe in Bytes.SharedArrayBuffer.prototype.slice()Gibt ein neues
SharedArrayBufferzurück, dessen Inhalt eine Kopie der Bytes diesesSharedArrayBufferist, vonbegin(einschließlich) bisend(ausschließlich). Wennbeginoderendnegativ 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
AtomicsArrayBuffer- 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-PolicyCross-Origin-Embedder-PolicyCross-Origin-Resource-PolicyWindow.crossOriginIsolatedundWorkerGlobalScope.crossOriginIsolated- SharedArrayBuffer-Updates in Android Chrome 88 und Desktop Chrome 92 auf developer.chrome.com (2021)