【发布时间】:2018-06-29 00:18:27
【问题描述】:
这是MDN documentation on Atomics。
我不明白如何在现实生活中使用原子对象,或者它们是否仅供内部使用(即根本不打算调用)。
Atomics 对象在 JavaScript 中的作用是什么?我该如何使用它们?
【问题讨论】:
-
@AlexisTyler:你为什么在这个问题上发布赏金,而不是在链接的副本上?
标签: javascript atomic
这是MDN documentation on Atomics。
我不明白如何在现实生活中使用原子对象,或者它们是否仅供内部使用(即根本不打算调用)。
Atomics 对象在 JavaScript 中的作用是什么?我该如何使用它们?
【问题讨论】:
标签: javascript atomic
此功能是在 ECMAScript 2017 中引入的。Shared Memory 和 Atomics 引入了一种新的内存模型,允许多代理程序使用原子操作进行通信,即使在并行 CPU 上也能确保明确定义的执行顺序。此规范还包括 Object 上的新静态方法:Object.values、Object.entries 和 Object.getOwnPropertyDescriptors。
主要思想是为 JavaScript 带来某种多线程特性,以便 JS 开发人员可以在未来编写高性能的并发程序,允许自己管理内存,而不是让 JS 引擎管理内存。
这是由一种名为SharedArrayBuffer 的新型全局对象完成的,它本质上将数据存储在共享内存空间中。所以这些数据可以在主 JS 线程和 web-worker 线程之间共享。
您只需使用SharedArrayBuffer,主线程和多个网络工作者线程都可以立即访问数据。
但是线程之间共享内存会导致竞争条件。为了帮助避免竞争条件,引入了Atomics 全局对象。 Atomics 提供了多种方法来在线程使用其数据时锁定共享内存。它还提供了安全更新共享内存中此类数据的方法。
让我们等待一些新的抽象库,它将使用这些 API 的权利。
a cartoon intro to SharedArrayBuffers
JavaScript: From Workers to Shared Memory
Avoiding race conditions in SharedArrayBuffers with Atomics
还推荐查看tutorial 关于 ECMAScript 中的共享内存。
【讨论】:
多线程编程的危险
要解决之前的问题,我们可以做什么?
使用原子选项
Atomics 对象提供原子操作,例如 add、sub、and、or、xor、load、store 等作为静态方法。它们与 SharedArrayBuffer 对象一起使用。
更多信息和一个很好的例子: 来源:https://www.slideshare.net/barakdrechsler/atomic-javascript
https://www.geeksforgeeks.org/atomics-or-in-javascript/
获取第 12 章 SharedArrayBuffer 中的好资源:
Phang, C. L. (2017). An Effective Guide to Modern JavaScript:(ECMAScript 2017/ES 8). Chong Lip Phang.
<iframe frameborder="0" scrolling="no" style="border:0px" src="https://books.google.com.tw/books?id=--gvDwAAQBAJ&lpg=PP3&ots=zqgshUnSQa&dq=atomic%20%20SharedArrayBuffer%20%20for%20javascript&lr&pg=PA80&output=embed" width=500 height=500></iframe>
【讨论】: