Atomics
Atomics
命名空间对象包含用于执行原子操作的静态方法。它们与 SharedArrayBuffer
和 ArrayBuffer
对象一起使用。
描述
原子操作
当内存共享时,多个线程可以读取和写入内存中的相同数据。原子操作确保写入和读取可预测的值,操作在下一个操作开始之前完成,并且操作不会被中断。
等待和通知
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
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
const sab = new SharedArrayBuffer(1024);
const int32 = new Int32Array(sab);
读取线程正在休眠并等待位置 0,该位置预计为 0。只要为真,它就不会继续。但是,一旦写入线程存储了一个新值,它将由写入线程通知并返回新值 (123)。
Atomics.wait(int32, 0, 0);
console.log(int32[0]); // 123
写入线程存储一个新值,并在写入后通知等待线程
console.log(int32[0]); // 0;
Atomics.store(int32, 0, 123);
Atomics.notify(int32, 0, 1);
规范
规范 |
---|
ECMAScript 语言规范 # sec-atomics-object |
浏览器兼容性
BCD 表仅在启用 JavaScript 的浏览器中加载。
另请参阅
ArrayBuffer
- JavaScript 类型化数组 指南
- Web Workers
- 共享内存 - 简要教程 在 TC39 ecmascript-sharedmem 建议中
- JavaScript 新并行原语初体验 在 hacks.mozilla.org 上 (2016)