Atomics 对象提供了一组静态方法对SharedArrayBuffer
和 ArrayBuffer
对象进行原子操作。
这些原子操作属于 Atomics模块,与 一般的对象不同,不是构造函数,不能使用new 操作符来调用,也不能当作函数直接调用。Atomics所有属性和方法都是静态的(跟Math差不多)。
原子操作
多个共享内存的线程是能够同时读写同一个位置上的数据。原子操作能够保证在读写的过程中让这些操作一个一个的依次执行,一个原子操作的过程不会被中断,这样就避免出现一些意外情况。
等待wait()和通知notify()
wait() 和 notify() 方法采用的是 Linux 上的 futexex 模型(“快速用户空间互斥量”),可以让进程一直等到某一个特定的条件为真再继续执行,主要用于实现阻塞。
给定一个共享的Int32Array:
const sab = new SharedArrayBuffer(1024);
const int32 = new Int32Array(sab);
读取线程正在休眠在位置0等待,只要这个位置上的数据满足等于零的条件,它就会一直等下去。但是一旦写入线程存储了新数据,写入线程就会通知它并返回新值(123)。
Atomics.wait(int32, 0, 0,);
console.log(int32[0]);
写入线程存入新值并且在写入完成之后通知等待线程:
console.log(int32[0]); // 0
Atomics.store(int32, 0, 123);
// 三个参数 共享内存的视图数组 数据位置 唤醒线程数量 默认infinity
Atomics.notify(int32, 0, 1);
其他方法
Atomics.add(intArrBuffer, index, value); // 把index的值与value相加 返回操作前的值
Atomics.sub(intArrBuffer, index, value); // 把index的值减去value 返回操作前的值
Atomics.add/.or/.xor // 位运算
Atomics.compareExchange(intArrBuffer, 12,13,33); // 只要index12位置上的值等于13的时候,把它替换为33,并返回13