--- title: Atomics slug: Web/JavaScript/Reference/Global_Objects/Atomics tags: - JavaScript translation_of: Web/JavaScript/Reference/Global_Objects/Atomics ---
{{JSRef}}
Atomics
对象提供了一组静态方法对 {{jsxref("SharedArrayBuffer")}} 和 {{jsxref("ArrayBuffer")}} 对象进行原子操作。
这些原子操作属于 Atomics
模块。与一般的全局对象不同,Atomics
不是构造函数,因此不能使用 new 操作符调用,也不能将其当作函数直接调用。Atomics
的所有属性和方法都是静态的(与 {{jsxref("Math")}} 对象一样)。
多个共享内存的线程能够同时读写同一位置上的数据。原子操作会确保正在读或写的数据的值是符合预期的,即下一个原子操作一定会在上一个原子操作结束后才会开始,其操作过程不会中断。
wait()
和 notify()
方法采用的是 Linux 上的 futexes 模型(“快速用户空间互斥量”),可以让进程一直等待直到某个特定的条件为真,主要用于实现阻塞。
true
;否则就意味着对于该数组,Atomics
对象中的各原子操作都只能用锁来实现。此函数面向的是技术专家。ok
"、"not-equal
" 或 "time-out
"。调用时,如果当前线程不允许阻塞,则会抛出异常(大多数浏览器都不允许在主线程中调用 wait()
)。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 ✅ // 12 ❌ Atomics.and(ta, 0, 1); // 17 Atomics.load(ta, 0); // 1 Atomics.compareExchange(ta, 0, 5, 12); Atomics.load(ta, 0); // 12 Atomics.exchange(ta, 0, 12); 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); Atomics.load(ta, 0); // 5 Atomics.store(ta, 0, 12); // 12 Atomics.sub(ta, 0, 2); Atomics.load(ta, 0); // 3 Atomics.xor(ta, 0, 1); Atomics.load(ta, 0); // 4
给定一个共享的 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);
Specification |
---|
{{SpecName('ESDraft', '#sec-atomics-object', 'Atomics')}} |
{{Compat("javascript.builtins.Atomics")}}