📜  JavaScript 中的 Atomics.isLockFree()

📅  最后修改于: 2022-05-13 01:58:10.581000             🧑  作者: Mango

JavaScript 中的 Atomics.isLockFree()

什么是原子?

  • Atomics 是 JavaScript 中的一个对象,它提供了将原子操作作为静态方法执行的能力。
  • 就像 JavaScript 中的 Math 对象一样,Atomics 的所有属性和方法也是静态的。
  • 原子与 SharedArrayBuffer(通用固定长度二进制数据缓冲区)对象一起使用。
  • 原子不是像其他全局对象那样的构造函数。
  • 原子不能与 new运算符一起使用,也不能作为函数调用。

JavaScript 中的原子操作
当有共享内存时,多个线程可以在内存中读取和写入相同的数据。为确保准确写入和读取预测值,除非当前操作完成,否则无法开始另一操作。原子操作也不能中断。
Atomics.isLockFree() 方法

  • 如果给定大小是整数 TypedArray 类型的 BYTES_PER_ELEMENT 属性之一,则 Atomics.isLockFree() 操作返回 true,否则 Atomics.isLockFree() 操作返回 false。
  • 无需锁即可操作无锁元件,并且用户不需要提供其自己的锁定机构。

什么是整数 TypedArray 的 BYTES_PER_ELEMENT 属性?

  • TypedArray.BYTES_PER_ELEMENT 属性表示类型化数组中每个元素的字节大小。
  • 由于 TypedArray 对象在每个元素的字节数和解释字节的方式上彼此不同。
  • BYTES_PER_ELEMENT 常量包含给定 TypedArray 中每个元素的字节数。

应用:

  • Atomics.isLockFree() 用于检查操作是否无锁。
  • 可用于验证整数 TypedArray 的 BYTES_PER_ELEMENT 属性。

句法:

Atomics.isLockFree(size)

下面提供了上述函数的示例

Input : Atomics.isLockFree(5)
Output : false

说明:在此示例中,“5”作为参数发送到 Atomics.isLockFree() 方法,它返回 false,因为“5”不是 BYTES_PER_ELEMENT 值之一。

Input : Atomics.isLockFree(6)
Output : false

说明:在此示例中,“6”作为参数发送到 Atomics.isLockFree() 方法,它返回 false,因为“6”不是 BYTES_PER_ELEMENT 值之一。

Input : Atomics.isLockFree(2)
Output : true

说明:在本例中,“2”作为参数发送到 Atomics.isLockFree() 方法,它返回 true,因为“2”是 BYTES_PER_ELEMENT 值之一。

Input : Atomics.isLockFree(4)
Output : true

说明:在本例中,“4”作为参数发送到 Atomics.isLockFree() 方法,它返回 true,因为“4”是 BYTES_PER_ELEMENT 值之一。
下面提供了上述函数的代码。
代码 1:

javascript


javascript


javascript


javascript


javascript


输出 :

false

代码 2:

javascript


输出 :

false

代码 3:

javascript


输出 :

true

代码 4:

javascript


输出 :

true

应用:
每当我们想要检查一个操作是否是无锁的,或者我们想要验证整数 TypedArray 的 BYTES_PER_ELEMENT 属性时,我们都会使用 JavaScript 中的 Atomics.isLockFree() 操作。
让我们看一个 JavaScript 程序:

javascript


输出 :

true

例外:

  • 如果 typedArray 不是允许的整数类型之一,那么 Atomics.isLockFree() 操作会抛出 TypeError。
  • 如果 typedArray 不是共享类型数组,那么 Atomics.isLockFree() 操作会抛出 TypeError。

支持的浏览器:

  • 谷歌浏览器
  • 微软边缘
  • 火狐