原子能

基线 广泛可用

此功能已得到很好的建立,可在许多设备和浏览器版本中使用。从那时起,它就可以跨浏览器使用了 2021年12月.

这个原子能namespace对象包含用于执行原子操作的静态方法。它们用于SharedArrayBuffer(共享阵列缓冲区)阵列缓冲区物体。

描述

与大多数全局对象不同,原子能不是构造函数。您不能将其与新的操作人员或调用原子能对象作为函数。的所有属性和方法原子能是静态的(就像数学对象)。

原子能操作

共享内存时,多个线程可以在内存中读写相同的数据。原子操作确保写入和读取可预测的值,确保操作在下一个操作开始之前完成,并且操作不会中断。

等待并通知

这个等待()通知()方法是在Linux futexes(“快速用户空间互斥体”)上建模的,并提供了等待特定条件实现的方法,通常用作阻塞构造。

静态特性

原子[Symbol.toStringTag]

的初始值[Symbol.toStringTag]属性是字符串“原子”。此属性用于Object.prototype.toString().

静态方法

原子.add()

将提供的值添加到数组指定索引处的现有值。返回该索引处的旧值。

原子和()

使用提供的值对数组指定索引处的值进行逐位“与”运算。返回该索引处的旧值。

Atomics.compareExchange()

如果值等于值,则在数组的指定索引处存储值。返回旧值。

原子交换()

在数组的指定索引处存储值。返回旧值。

原子.isLockFree()

一种优化原语,可用于确定是使用锁还是原子操作。退换商品真实的如果给定元素大小的数组上的原子操作将使用硬件原子操作(而不是锁)实现。仅限专家。

原子加载()

返回数组指定索引处的值。

原子.notify()

通知正在等待阵列的指定索引的代理。返回已通知的代理数。

原子或()

使用提供的值对数组的指定索引处的值计算按位“或”。返回该索引处的旧值。

原子.store()

在数组的指定索引处存储值。返回值。

原子.sub()

在数组的指定索引处减去一个值。返回该索引处的旧值。

原子学.wait()

验证数组的指定索引是否仍包含值并等待或超时。返回其中之一“确定”,“不平等”,或“超时”。如果呼叫代理中不允许等待,则会引发异常。(大多数浏览器不允许等待()在浏览器的主线程上。)

原子.waitAsync()

异步等待(即不阻塞,与原子等待)并返回一个承诺.

原子学.xor()

使用提供的值对数组指定索引处的值进行按位异或计算。返回该索引处的旧值。

示例

使用原子

js公司
const sab=新的SharedArrayBuffer(1024);const ta=新Uint8Array(sab);ta[0];//0ta[0]=5;//5原子。添加(ta,0,12);//5原子载荷(ta,0);//17原子和(ta,0,1);//17原子载荷(ta,0);//1原子比较交换(ta,0,5,12);//1原子载荷(ta,0);//1原子交换(ta,0,12);//1原子载荷(ta,0);//12Atomics.isLockFree(1);//真实的Atomics.isLockFree(2);//真实的Atomics.isLockFree(3);//Atomics.isLockFree(4);//真实的原子或(ta,0,1);//12原子载荷(ta,0);//13原子存储(ta,0,12);//12原子.sub(ta,0,2);//12原子载荷(ta,0);//10原子异或(ta,0,1);//10原子载荷(ta,0);//11

等待和通知

给定共享Int32阵列:

js公司
const sab=新的SharedArray缓冲区(1024);const int32=新的Int32Array(sab);

读取线程正在睡眠并等待位置0,该位置应为0。只要这是真的,它就不会继续。然而,一旦写入线程存储了一个新值,它就会被写入线程通知并返回新值(123)。

js公司
原子等待(int32,0,0);控制台.log(int32[0]);//123

写入线程存储一个新值,并在写入后通知等待线程:

js公司
控制台.log(int32[0]);//0;原子存储(int32,0,123);Atomics.notify(int32,0,1);

规格

规范
ECMAScript语言规范
#sec-atomics-对象

浏览器兼容性

BCD表仅在浏览器中加载

另请参见