Atomics

基线 广泛可用

此功能已得到良好建立,并在许多设备和浏览器版本中运行。它自以下版本起在所有浏览器中都可用 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()

计算数组指定索引处的数值与提供的数值的按位与。返回该索引处的旧数值。

Atomics.compareExchange()

如果数值等于某个值,则在数组的指定索引处存储该数值。返回旧数值。

Atomics.exchange()

在数组的指定索引处存储一个值。返回旧数值。

Atomics.isLockFree()

一种优化原语,可用于确定是使用锁还是原子操作。如果对给定元素大小的数组的原子操作将使用硬件原子操作(而不是锁)来实现,则返回 true。仅供专家使用。

Atomics.load()

返回数组指定索引处的数值。

Atomics.notify()

通知正在等待数组指定索引的代理。返回已通知的代理数量。

Atomics.or()

计算数组指定索引处的数值与提供的数值的按位或。返回该索引处的旧数值。

Atomics.store()

在数组的指定索引处存储一个值。返回该值。

Atomics.sub()

从数组指定索引处的数值中减去一个值。返回该索引处的旧数值。

Atomics.wait()

验证数组的指定索引是否仍然包含一个值,并等待或超时。返回 "ok""not-equal""timed-out" 之一。如果在调用代理中不允许等待,则会抛出异常。(大多数浏览器不允许在浏览器的主线程上使用 wait()。)

Atomics.waitAsync()

异步(即不阻塞,与 Atomics.wait 不同)等待共享内存位置并返回一个 Promise

Atomics.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。只要为真,它就不会继续。但是,一旦写入线程存储了一个新值,它将由写入线程通知并返回新值 (123)。

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 语言规范
# sec-atomics-object

浏览器兼容性

BCD 表仅在启用 JavaScript 的浏览器中加载。

另请参阅