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

浏览器兼容性

另见