Atomics
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since December 2021.
Das Atomics
-Namensraumobjekt enthält statische Methoden für die Durchführung atomarer Operationen. Sie werden mit SharedArrayBuffer
- und ArrayBuffer
-Objekten verwendet.
Beschreibung
Im Gegensatz zu den meisten globalen Objekten ist Atomics
kein Konstruktor. Sie können es nicht mit dem new
operator verwenden oder das Atomics
-Objekt als Funktion aufrufen. Alle Eigenschaften und Methoden von Atomics
sind statisch (genau wie das Math
-Objekt).
Atomare Operationen
Wenn Speicher gemeinsam genutzt wird, können mehrere Threads dieselben Daten im Speicher lesen und schreiben. Atomare Operationen stellen sicher, dass vorhersagbare Werte geschrieben und gelesen werden, dass Operationen abgeschlossen sind, bevor die nächste Operation beginnt, und dass Operationen nicht unterbrochen werden.
Warten und Benachrichtigen
Die wait()
- und notify()
-Methoden basieren auf Linux-Futexen ("fast user-space mutex") und bieten Möglichkeiten, zu warten, bis eine bestimmte Bedingung wahr wird, und werden typischerweise als blockierende Konstrukte verwendet.
Statische Eigenschaften
Atomics[Symbol.toStringTag]
-
Der Anfangswert der
[Symbol.toStringTag]
-Eigenschaft ist der String"Atomics"
. Diese Eigenschaft wird inObject.prototype.toString()
verwendet.
Statische Methoden
Atomics.add()
-
Fügt den angegebenen Wert zum vorhandenen Wert am angegebenen Index des Arrays hinzu. Gibt den alten Wert an diesem Index zurück.
Atomics.and()
-
Führt eine bitweise UND-Verknüpfung auf den Wert am angegebenen Index des Arrays mit dem angegebenen Wert aus. Gibt den alten Wert an diesem Index zurück.
Atomics.compareExchange()
-
Speichert einen Wert am angegebenen Index des Arrays, wenn er einem Wert entspricht. Gibt den alten Wert zurück.
Atomics.exchange()
-
Speichert einen Wert am angegebenen Index des Arrays. Gibt den alten Wert zurück.
Atomics.isLockFree()
-
Ein Optimierungsprimitive, das verwendet werden kann, um zu bestimmen, ob Sperren oder atomare Operationen verwendet werden sollen. Gibt
true
zurück, wenn eine atomare Operation auf Arrays der angegebenen Elementgröße mit einer Hardware-atomaren Operation (statt einer Sperre) implementiert wird. Nur für Experten. Atomics.load()
-
Gibt den Wert am angegebenen Index des Arrays zurück.
Atomics.notify()
-
Benachrichtigt Agenten, die am angegebenen Index des Arrays warten. Gibt die Anzahl der benachrichtigten Agenten zurück.
Atomics.or()
-
Führt eine bitweise ODER-Verknüpfung auf den Wert am angegebenen Index des Arrays mit dem angegebenen Wert aus. Gibt den alten Wert an diesem Index zurück.
Atomics.store()
-
Speichert einen Wert am angegebenen Index des Arrays. Gibt den Wert zurück.
Atomics.sub()
-
Subtrahiert einen Wert am angegebenen Index des Arrays. Gibt den alten Wert an diesem Index zurück.
Atomics.wait()
-
Überprüft, ob der angegebene Index des Arrays immer noch einen Wert enthält, und schläft, bis er erwartet oder ein Timeout eintritt. Gibt entweder
"ok"
,"not-equal"
oder"timed-out"
zurück. Wenn das Warten im aufrufenden Agenten nicht erlaubt ist, wird eine Ausnahme ausgelöst. (Die meisten Browser erlauben keinwait()
im Hauptthread des Browsers.) Atomics.waitAsync()
-
Wartet asynchron (d. h. ohne Blockierung, im Gegensatz zu
Atomics.wait
) an einem gemeinsamen Speicherort und gibt ein Objekt zurück, das das Ergebnis der Operation darstellt. Atomics.xor()
-
Führt eine bitweise XOR-Verknüpfung auf den Wert am angegebenen Index des Arrays mit dem angegebenen Wert aus. Gibt den alten Wert an diesem Index zurück.
Beispiele
Verwendung von Atomics
const sab = new SharedArrayBuffer(1024);
const ta = new Uint8Array(sab);
ta[0]; // 0
ta[0] = 5; // 5
Atomics.add(ta, 0, 12); // 5
Atomics.load(ta, 0); // 17
Atomics.and(ta, 0, 1); // 17
Atomics.load(ta, 0); // 1
Atomics.compareExchange(ta, 0, 5, 12); // 1
Atomics.load(ta, 0); // 1
Atomics.exchange(ta, 0, 12); // 1
Atomics.load(ta, 0); // 12
Atomics.isLockFree(1); // true
Atomics.isLockFree(2); // true
Atomics.isLockFree(3); // false
Atomics.isLockFree(4); // true
Atomics.or(ta, 0, 1); // 12
Atomics.load(ta, 0); // 13
Atomics.store(ta, 0, 12); // 12
Atomics.sub(ta, 0, 2); // 12
Atomics.load(ta, 0); // 10
Atomics.xor(ta, 0, 1); // 10
Atomics.load(ta, 0); // 11
Warten und Benachrichtigen
Angenommen, ein Int32Array
wird gemeinsam genutzt:
const sab = new SharedArrayBuffer(1024);
const int32 = new Int32Array(sab);
Ein lesender Thread schläft und wartet an Position 0, die erwartungsgemäß 0 sein soll. Solange das wahr ist, wird er nicht fortfahren. Sobald der schreibende Thread jedoch einen neuen Wert gespeichert hat, wird er vom schreibenden Thread benachrichtigt und gibt den neuen Wert (123) zurück.
Atomics.wait(int32, 0, 0);
console.log(int32[0]); // 123
Ein schreibender Thread speichert einen neuen Wert und benachrichtigt den wartenden Thread, sobald er geschrieben hat:
console.log(int32[0]); // 0;
Atomics.store(int32, 0, 123);
Atomics.notify(int32, 0, 1);
Spezifikationen
Specification |
---|
ECMAScript Language Specification # sec-atomics-object |
Browser-Kompatibilität
BCD tables only load in the browser
Siehe auch
ArrayBuffer
- JavaScript-typisierte Arrays Leitfaden
- Web Worker
- Gemeinsamer Speicher – ein kurzes Tutorial im TC39 ecmascript-sharedmem-Vorschlag
- Ein Vorgeschmack auf die neuen parallelen Primitiven von JavaScript auf hacks.mozilla.org (2016)