原子性

Atomics 命名空间对象包含用于执行原子操作的静态方法。它们与 SharedArrayBufferArrayBuffer 对象一起使用。

¥The Atomics namespace object contains static methods for carrying out atomic operations. They are used with SharedArrayBuffer and ArrayBuffer objects.

描述

¥Description

与大多数全局对象不同,Atomics 不是构造函数。你不能将其与 new 运算符 一起使用或将 Atomics 对象作为函数调用。Atomics 的所有属性和方法都是静态的(就像 Math 对象一样)。

¥Unlike most global objects, Atomics is not a constructor. You cannot use it with the new operator or invoke the Atomics object as a function. All properties and methods of Atomics are static (just like the Math object).

原子操作

¥Atomic operations

当内存共享时,多个线程可以在内存中读写相同的数据。原子操作确保写入和读取可预测的值,操作在下一个操作开始之前完成,并且操作不会中断。

¥When memory is shared, multiple threads can read and write the same data in memory. Atomic operations make sure that predictable values are written and read, that operations are finished before the next operation starts and that operations are not interrupted.

等待并通知

¥Wait and notify

wait()notify() 方法以 Linux futexes ("快速用户空间互斥体") 为模型,提供等待特定条件变为 true 的方法,通常用作阻塞构造。

¥The wait() and notify() methods are modeled on Linux futexes ("fast user-space mutex") and provide ways for waiting until a certain condition becomes true and are typically used as blocking constructs.

静态属性

¥Static properties

Atomics[Symbol.toStringTag]

[Symbol.toStringTag] 属性的初始值为字符串 "Atomics"。该属性在 Object.prototype.toString() 中使用。

静态方法

¥Static methods

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()

对数组指定索引处的值与提供的值进行按位异或运算。返回该索引处的旧值。

示例

¥Examples

使用原子

¥Using 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

等待并通知

¥Waiting and notifying

给定一个共享的 Int32Array

¥Given a shared Int32Array:

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

读取线程正在睡眠并等待位置 0,该位置预计为 0。只要这是真的,它就不会继续下去。然而,一旦写入线程存储了新值,它将被写入线程通知并返回新值(123)。

¥A reading thread is sleeping and waiting on location 0 which is expected to be 0. As long as that is true, it will not go on. However, once the writing thread has stored a new value, it will be notified by the writing thread and return the new value (123).

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

写入线程存储新值并在写入后通知等待线程:

¥A writing thread stores a new value and notifies the waiting thread once it has written:

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

规范

Specification
ECMAScript Language Specification
# sec-atomics-object

¥Specifications

浏览器兼容性

BCD tables only load in the browser

¥Browser compatibility

也可以看看

¥See also