Atomics

Baseline 廣泛可用 *

此功能已成熟,可在多種裝置和瀏覽器版本上使用。自 2021 年 12 月以來,它已在所有瀏覽器中可用。

* 此特性的某些部分可能存在不同級別的支援。

Atomics 名稱空間物件包含用於執行原子操作的靜態方法。它們與 SharedArrayBufferArrayBuffer 物件一起使用。

描述

與大多數全域性物件不同,Atomics 不是建構函式。您不能將其與 new 運算子 一起使用,也不能將 Atomics 物件呼叫為函式。Atomics 的所有屬性和方法都是靜態的(就像 Math 物件一樣)。

原子操作

當記憶體被共享時,多個執行緒可以讀寫記憶體中的相同資料。原子操作確保寫入和讀取的值是可預測的,操作在下一個操作開始之前完成,並且操作不會被中斷。

等待和通知

wait()notify() 方法模仿了 Linux futexes(“快速使用者空間互斥鎖”)並提供了等待特定條件成立的方法,通常用作阻塞構造。

靜態屬性

Atomics[Symbol.toStringTag]

[Symbol.toStringTag] 屬性的初始值為字串 "Atomics"。此屬性用於 Object.prototype.toString()

靜態方法

Atomics.add()

將提供的值新增到陣列指定索引處的現有值。返回該索引處的舊值。

Atomics.and()

計算陣列指定索引處的位值與提供的值之間的按位 AND。返回該索引處的舊值。

Atomics.compareExchange()

如果陣列指定索引處的值等於給定值,則將該值儲存到該索引處。返回舊值。

Atomics.exchange()

將值儲存到陣列指定索引處。返回舊值。

Atomics.isLockFree()

一種最佳化原語,可用於確定是使用鎖還是原子操作。如果對給定元素大小的陣列進行原子操作將使用硬體原子操作(而不是鎖)來實現,則返回 true。僅限專家。

Atomics.load()

返回陣列指定索引處的值。

Atomics.notify()

通知正在等待陣列指定索引的代理。返回被通知的代理數量。

Atomics.or()

計算陣列指定索引處的位值與提供的值之間的按位 OR。返回該索引處的舊值。

Atomics.pause()

提供微等待原語,提示 CPU 呼叫者正在忙等待訪問共享資源。這使得系統可以減少分配給核心(例如電源)或執行緒的資源,而無需放棄當前執行緒。

Atomics.store()

將值儲存到陣列指定索引處。返回該值。

Atomics.sub()

從陣列指定索引處的值減去一個值。返回該索引處的舊值。

Atomics.wait()

驗證陣列指定索引處的值是否仍然是給定值,然後休眠等待或超時。返回 "ok""not-equal""timed-out"。如果在呼叫代理中不允許等待,則會丟擲異常。(大多數瀏覽器不允許在瀏覽器的主執行緒上使用 wait()。)

Atomics.waitAsync()

非同步等待(即,不阻塞,與 Atomics.wait 不同)共享記憶體位置,並返回一個表示操作結果的物件。

Atomics.xor()

計算陣列指定索引處的位值與提供的值之間的按位 XOR。返回該索引處的舊值。

示例

使用 Atomics

js
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

等待和通知

給定一個共享的 Int32Array

js
const sab = new SharedArrayBuffer(1024);
const int32 = new Int32Array(sab);

讀取執行緒正在位置 0 休眠並等待,因為提供的值與提供索引處儲存的值匹配。讀取執行緒不會繼續,直到寫入執行緒呼叫了對提供的型別化陣列位置 0 的 Atomics.notify()。請注意,如果在喚醒後,位置 0 的值未被寫入執行緒更改,則讀取執行緒**不會**重新休眠,而是會繼續執行。

js
Atomics.wait(int32, 0, 0);
console.log(int32[0]); // 123

寫入執行緒儲存一個新值,並在寫入後通知等待執行緒

js
console.log(int32[0]); // 0;
Atomics.store(int32, 0, 123);
Atomics.notify(int32, 0, 1);

規範

規範
ECMAScript® 2026 語言規範
# sec-atomics-object

瀏覽器相容性

另見