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)
Parameters Used:
size : It is the size in bytes to check
Return Value:
Atomics.isLockFree() returns either Boolean true indicating the operation is lock free or it returns false.
下面提供了上述函数的示例。
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。
支持的浏览器:
- 谷歌浏览器
- 微软边缘
- 火狐