MDN wants to talk to developers like you: https://qsurvey.mozilla.com/s3/8d22564490d8

这是一个实验中的功能
此功能某些浏览器尚在开发中,请参考浏览器兼容性表格以得到在不同浏览器中适合使用的前缀。由于该功能对应的标准文档可能被重新修订,所以在未来版本的浏览器中该功能的语法和行为可能随之改变。

Atomics 对象以静态方法的形式提供原子操作。这些操作使用 SharedArrayBuffer 对象。

Atomic 操作由 Atomics 模块提供。与其他全局对象不同,Atomics 不是构造器。你不能使用 new 操作符来创建一个 Atomics 对象,也不能将 Atomics 当作函数来调用。所有的 Atomics 的属性和方法都是静态的(就像 Math  对象一样)。

方法

Atomic operations

当内存共享时,多线程可以读写相同的内存数据。原子操作保证数据的读写是符合期望的,即下一个操作会在上一个操作结束后开始,上一个操作不会被打断。

 
Atomics.add()
添加一个值到数组指定的位置。返回这个位置上的旧值。
Atomics.and()
对数组指定位置上的值进行位与操作。返回这个位置上的旧值。
Atomics.compareExchange()
将给定的值存储在数组中的指定位置,如果原有的值与给定的值相等,则返回原有的值
Atomics.exchange()
存储给定值到数组指定位置。返回这个位置上的旧值。
Atomics.load()
返回数组指定位置上的值
Atomics.or()
对数组指定位置上的值进行位或操作。返回这个位置上的旧值。
Atomics.store()
将给定值存在数组的指定位置。返回这个“给定值”。
Atomics.sub()
将数组指定位置上的值减去一个给定值。返回这个指定位置上的旧值。
Atomics.xor()
对数组指定位置上的值进行异或操作。返回这个位置上的旧值。

Wait and wake

linux futexes("快速用户空间互斥量")产生了 wait(),wake() 方法模式。wait/wake 方式提供了使进程一直等待直到特定条件为真的方法。它的典型应用是在阻塞结构中。

Atomics.wait()
检测数组给定位置上的值是否仍旧包含一个给定的值,并且保持挂起或者直到超时。返回"ok","not-equal","time-out"中的一个。如果 wating 在调用客户端不被允许,那么该方法会抛出一个异常(大多数浏览器不会允许在它们的主线程使用wait())。
Atomics.wake()
唤醒等待队列中指定位置的客户端。返回被成功唤醒的客户端数量
Atomics.isLockFree(size)

用于决定对象是否可以使用 lock 或者 atomic 操作的优化原语。如果一个给定了大小的数组可以使用硬件的原子操作实现原子操作,那么返回 true。

规范

Specification Status Comment
ECMAScript Shared Memory and Atomics
Atomics
Draft Initial definition.
ECMAScript 2017 Draft (ECMA-262) Draft  

浏览器支持

Feature Chrome Edge Firefox (Gecko) Internet Explorer Opera Safari
Basic support 未实现 [2] 未实现 46 (46) [1] [3] 未实现 未实现 未实现
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support 未实现 未实现 46.0 (46) [1] 未实现 未实现 未实现

[1] 在默认设置中这个功能不可用. 可以在about:config 中设置 javascript.options.shared_memory 为 true 以启用该功能

[2] 这个功能的实现还在开发中,并且需要一些运行时 flags 的支持: --js-flags=--harmony-sharedarraybuffer --enable-blink-feature=SharedArrayBuffer

兼容性提示

[3]  Shared memory 的标准依然不变. 在 SpiderMonkey 48 (Firefox 48 / Thunderbird 48 / SeaMonkey 2.45)之前, 最后一个API 的名称和语意还没有实现完成. FirFox 46 版本和FireFox 48 版本之前的差别有:

  • Atomics.futexWakeOrRequeue() 方法和 Atomics.fence() 方法现在被完全移除 (bug(1259544)、bug(1225028))
  •  Atomics.wait() 方法和 Atomics.wake() 方法现在改名叫做 Atomics.futexWait() 和 Atomics.futexWake() (bug 1260910). 注意: 之前的名称在 49版本之后将完全移除 (bug 1262062).
  • 属性 Atomics.OK, Atomics.TIMEDOUT, Atomics.NOTEQUAL 已经被移除. Atomics.wait() 方法现在返回字符串 "ok", "timed-out" 和"not-equal" (bug 1260835).
  • Atomics.wake() 方法的 count 参数的默认值发生改变 : 现在的默认值为 +Infinity, 而不是 0 (bug 1253350).

相关

文档标签和贡献者

 此页面的贡献者: Ende93, Hearmen, weishuaikun, Spring_Winter_Wine
 最后编辑者: Ende93,