原子性
Atomics
命名空间对象包含用于执行原子操作的静态方法。它们与 SharedArrayBuffer
和 ArrayBuffer
对象一起使用。
¥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()
-
对数组指定索引处的值与提供的值进行按位异或运算。返回该索引处的旧值。
示例
使用原子
¥Using 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
等待并通知
¥Waiting and notifying
给定一个共享的 Int32Array
:
¥Given a shared Int32Array
:
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).
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:
console.log(int32[0]); // 0;
Atomics.store(int32, 0, 123);
Atomics.notify(int32, 0, 1);
规范
Specification |
---|
ECMAScript Language Specification # sec-atomics-object |
浏览器兼容性
BCD tables only load in the browser
也可以看看
¥See also
ArrayBuffer
- JavaScript 类型数组 指南
- Web 工作线程
- TC39 ecmascript-sharedmem 提案中的 共享内存 – 简短教程
- hacks.mozilla.org 上的 JavaScript 的新并行原语初体验 (2016)