这是一个实验中的功能
此功能某些浏览器尚在开发中,请参考浏览器兼容性表格以得到在不同浏览器中适合使用的前缀。由于该功能对应的标准文档可能被重新修订,所以在未来版本的浏览器中该功能的语法和行为可能随之改变。
Atomics
对象以静态方法的形式提供对SharedArrayBuffer
对象的原子操作。
Atomic 操作由 Atomics
模块提供。与其他全局对象不同,Atomics
不是构造器。你不能使用 new 操作符来创建一个 Atomics 对象,也不能将 Atomics
当作函数来调用。所有的 Atomics
的属性和方法都是静态的(就像 Math
对象一样)。
方法
Atomic operations
当内存共享时,内存中的数据块可能被多个线程同时读写。Atomic 操作保障了数据读写符合预期,即下一个操作一定会在上一个操作结束后才开始,操作也不会被中断。
Atomics.add()
- 将数组指定位置上的值加上一个给定值。返回这个位置上的旧值。
Atomics.and()
- 对数组指定位置上的值进行位与操作。返回这个位置上的旧值。
Atomics.compareExchange()
- 如果数组中特定位置的值与给定的值相等,则更新为另一个指定的值。返回这个位置上的旧值
Atomics.exchange()
- 存储给定值到数组指定位置。返回这个位置上的旧值。
Atomics.load()
- 返回数组指定位置上的值。
Atomics.or()
- 对数组指定位置上的值进行位或操作。返回这个位置上的旧值。
Atomics.store()
- 将给定值存在数组的指定位置。返回这个“给定值”。
Atomics.sub()
- 将数组指定位置上的值减去一个给定值。返回这个指定位置上的旧值。
Atomics.xor()
- 对数组指定位置上的值进行异或操作。返回这个位置上的旧值。
Wait 和 wake
wait() 和 wake() 方法来源于 Linux 的 futexes ("fast user-space mutex,快速用户空间互斥量")。wait/wake 方式提供了使进程一直等待直到特定条件为真的方法,典型应用于阻塞设计中。
Atomics.wait()
- 检测数组给定位置上的值是否仍旧为一个给定的值,是则保持挂起等到唤醒(wake)直到超时。返回"
ok
","not-equal
","time-out
"中的一个。如果调用 wait() 的客户端不允许阻塞,那么该方法会抛出一个异常(大多数浏览器不允许在浏览器主线程中使用wait())。 Atomics.wake()
- 唤醒数组中指定位置的等待队列中的客户端。返回被成功唤醒的客户端数量。
Atomics.isLockFree(size)
- 判断特定操作的具体实现是使用锁还是原子操作,用于优化目的。可以判断对数组中特定长度元素进行的原子操作是通过硬件原子操作而不是锁来实现。此函数仅面向技术专家。
规范
Specification | Status | Comment |
---|---|---|
Unknown Atomics |
Unknown | Initial definition. |
ECMAScript Latest Draft (ECMA-262) | Living Standard |
浏览器支持
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).
相关
ArrayBuffer
- JavaScript typed arrays
- Web Workers
- parlib-simple – a simple library providing synchronization and work distribution abstractions.
- Shared Memory – a brief tutorial
- A Taste of JavaScript’s New Parallel Primitives – Mozilla Hacks