描述
与大多数全局对象不同,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
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 的 Atomics.notify()。请注意,如果在唤醒后,位置 0 的值未被写入线程更改,则读取线程**不会**重新休眠,而是会继续执行。
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® 2026 语言规范 # sec-atomics-object |
浏览器兼容性
加载中…
另见
ArrayBuffer- JavaScript 类型化数组指南
- Web Workers
- TC39 ecmascript-sharedmem 提案中的 共享内存 – 简要教程
- hacks.mozilla.org 上的 JavaScript 新并行原语初体验 (2016)