Atomics

Atomics 对象提供了一组静态方法对SharedArrayBufferArrayBuffer 对象进行原子操作。
这些原子操作属于 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ES全称ECMAScript,ECMAScript是ECMA制定的标准化脚本语言 ES6新特性(2015) ES6...
    考拉程序媛阅读 2,895评论 0 0
  • 线程与进程的区别? 进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元。一个程序至少有一个进程,一个进...
    奇点一氪阅读 2,865评论 0 1
  • 本文是我自己在秋招复习时的读书笔记,整理的知识点,也是为了防止忘记,尊重劳动成果,转载注明出处哦!如果你也喜欢,那...
    波波波先森阅读 13,872评论 4 56
  • 一、前言 不管什么语言,并发的编程都是在高级的部分,因为并发的涉及的知识太广,不单单是操作系统的知识,还有计算机的...
    毛毛的学习笔记阅读 3,122评论 0 1
  • 多线程 什么是多线程? CPU在线程之间快速切换,制造了线程并行运行的假象,好似它们在一个比实际CPU慢一些的CP...
    9283856ddec1阅读 3,715评论 0 0