这是MDN documentation on Atomics。
我无法理解原子对象如何在现实生活中使用,或者它们仅供内部使用(即根本不需要调用)。
Semaphore
对象在JavaScript中的作用是什么?我该如何使用它们?
答案 0 :(得分:12)
ECMAScript 2017引入了此功能。Shared Memory
和Atomics
引入了一种新的内存模型,该模型允许多代理程序使用原子操作进行通信,从而确保即使在并行CPU上也可以定义良好的执行顺序。该规范还包括Object
上的新静态方法:Object.values
,Object.entries
和Object.getOwnPropertyDescriptors
。
主要思想是为JavaScript带来某种多线程功能,以便JS开发人员将来可以通过允许自己管理内存而不是让JS引擎管理内存来编写高性能的并发程序。
这是通过一种名为SharedArrayBuffer
的新型全局对象完成的,该对象实际上将数据存储在共享内存空间中。因此,这些数据可以在JS主线程和Web工作者线程之间共享。
您只需使用SharedArrayBuffer
,主线程和多个Web工作者线程均可立即访问数据。
但是在线程之间共享内存会导致争用情况。为了帮助避免争用条件,引入了Atomics
全局对象。 Atomics
提供了多种方法来在线程使用线程的数据时锁定共享内存。它还提供了安全地更新共享内存中此类数据的方法。
让我们等待一些新的抽象库,它将使用这些API的权限。
a cartoon intro to SharedArrayBuffers
JavaScript: From Workers to Shared Memory
Avoiding race conditions in SharedArrayBuffers with Atomics
还建议在ECMAScript中查看有关共享内存的tutorial。
答案 1 :(得分:4)
多线程编程的危险
要解决先前的问题,我们该怎么办?
使用原子选项
Atomics对象提供原子操作,例如加,减和,或,或,加载,存储等作为静态方法。它们与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>