Atomics - 快速指南

Atomics - 概述

Atomics

Atomics 是 JavaScript 中的一个对象,它提供以静态方法执行的原子操作。就像 Math 对象的方法一样,Atomics 的方法和属性也是静态的。Atomics 与 SharedArrayBuffer 对象一起使用。

Atomic 操作安装在 Atomics 模块上。与其他全局对象不同,Atomics 不是构造函数。Atomics 不能与 new 运算符一起使用,也不能作为函数调用。

原子操作

原子操作不可中断。

当共享内存时,多个线程可以读取或写入内存中现有的数据。因此,如果任何数据发生更改,就会丢失数据。原子操作确保准确写入和读取预测值(数据)。原子操作只有在当前操作完成时才会启动,因此无法更改现有数据。

示例

以下是演示如何使用 JavaScript 原子操作的代码 −

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.add(arr, 0, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // 创建一个 SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // 用 6 初始化数组第 0 个位置的元素
            arr[0] = 6;
            container.innerHTML = Atomics.add(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

输出

验证结果。

Atomics - add() 方法

Atomics

Atomics 是 JavaScript 中的一个对象,它提供要作为静态方法执行的原子操作。就像 Math 对象的方法一样,Atomics 的方法和属性也是静态的。Atomics 与 SharedArrayBuffer 对象一起使用。

Atomic 操作安装在 Atomics 模块上。与其他全局对象不同,Atomics 不是构造函数。原子操作不能与 new 运算符一起使用,也不能作为函数调用。

原子操作

原子操作不可中断。

共享内存时,多个线程可以读取或写入内存中现有的数据。因此,如果任何数据发生更改,将导致数据丢失。原子操作确保准确写入和读取预测值(数据)。除非当前操作完成,否则原子操作不会启动,因此无法更改现有数据。

示例

以下是演示 JavaScript 原子操作用法的代码 −

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.add(arr, 0, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // 创建一个 SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // 用 6 初始化数组第 0 个位置的元素
            arr[0] = 6;
            container.innerHTML = Atomics.add(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

输出

验证结果。

Atomics - add() 方法

add 方法在数组的给定位置添加提供的值。它返回该位置的旧值。此原子操作可确保在修改后的值写回之前不会发生其他写入。

语法

Atomics.add(typedArray, index, value)

参数

  • typedArray 是整数类型数组。

  • index 是 typedarray 中的位置。

  • 要添加的值

返回

返回给定位置的旧值。

异常

  • TypeError 如果传递的数组不是整数类型数组。

  • RangeError 如果传递的索引超出了类型数组的界限。

示例

以下是实现 JavaScript Atomics 的代码 −

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.add(arr, 0, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // 创建一个 SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // 用 6 初始化数组第 0 个位置的元素
            arr[0] = 6;
            container.innerHTML = Atomics.add(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

输出

验证结果。

Atomics - and() 方法

and 方法使用数组中给定位置的提供值计算按位与。它返回该位置的旧值。此原子操作可确保在修改后的值写回之前不会发生其他写入。

语法

Atomics.and(typedArray, index, value)

参数

  • typedArray 是整数类型数组。

  • index 是 typedarray 中的位置。

  • value 要与其进行按位与计算。

返回

返回给定位置的旧值。

异常

  • TypeError 如果传递的数组不是整数类型数组。

  • 如果传递的索引超出类型数组的范围,则会出现 RangeError

示例

以下是实现 JavaScript Atomics 的代码 −

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.and(arr, 0, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // 创建一个 SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // 用 6 初始化数组第 0 个位置的元素
            arr[0] = 6;
            //6 & 2 = 110 & 010 = 010 = 2
            container.innerHTML = Atomics.and(arr, 0, 2) + '<br/>'+ Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

输出

验证结果。

Atomics - compareExchange() 方法

compareExchange 方法比较并交换替换值(如果给定值与旧值不同)。它返回该位置的旧值。此原子操作可确保在修改后的值被写回之前不会发生其他写入。

语法

Atomics.compareExchange(typedArray, index, expectedValue, replacementValue)

参数

  • typedArray 是整数类型数组。

  • index 是 typedarray 中的位置。

  • expectedValue 检查相等性。

  • replacementValue 交换。

返回

返回给定位置的旧值。

异常

  • TypeError 如果传递的数组不是整数类型数组。

  • RangeError 如果传递的索引超出类型数组的范围。

示例

以下是实现 JavaScript Atomics 的代码 −

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.compareExchange(arr, 0, 6, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // 创建一个 SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // 用 6 初始化数组第 0 个位置的元素
            arr[0] = 6;
            container.innerHTML = Atomics.compareExchange(arr, 0, 6, 2) + '<br/>' + Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

输出

验证结果。

Atomics - exchange() 方法

exchange 方法在数组的给定位置交换给定值。它返回该位置的旧值。此原子操作可确保在修改后的值写回之前不会发生其他写入。

语法

Atomics.exchange(typedArray, index, value)

参数

  • typedArray 是整数类型数组。

  • index 是 typedarray 中的位置。

  • 要交换的值

返回

返回给定位置的旧值。

异常

  • TypeError 如果传递的数组不是整数类型数组。

  • RangeError 如果传递的索引超出了类型数组的界限。

示例

以下是实现 JavaScript Atomics 的代码 −

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.exchange(arr, 0, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // 创建一个 SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // 用 6 初始化数组第 0 个位置的元素
            arr[0] = 6;
            container.innerHTML = Atomics.exchange(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

输出

验证结果。

Atomics - isLockFree() 方法

isLockFree 方法用于确定是否要对原子操作使用锁。如果给定的大小是整数 TypedArray 类型的 TypedArray.BYTES_PER_ELEMENT 属性之一,则它返回 true。 TypedArray.BYTES_PER_ELEMENT 表示类型化数组中每个元素的字节大小。

语法

Atomics.isLockFree(size)

参数

  • size 需要检查的字节数。

返回

如果操作是无锁的,则返回 true,否则返回 false。

示例

以下是实现 JavaScript Atomics 的代码 −

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.isLockFree(1)</p>
      <p>Atomics.isLockFree(3)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // 创建一个 SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // 用 6 初始化数组第 0 个位置的元素
            arr[0] = 6;
            // Int8Array.BYTES_PER_ELEMENT = 1
            container.innerHTML = Atomics.isLockFree(Int8Array.BYTES_PER_ELEMENT) + '<br/>' + Atomics.isLockFree(3);
         }
      </script>
   </body>
</html>

输出

验证结果。

Atomics - load() 方法

load 方法返回数组中给定位置的值。

语法

Atomics.load(typedArray, index)

参数

  • typedArray 是整数类型数组。

  • index 是 typedarray 中的位置。

返回

返回给定位置的值。

异常

  • TypeError 如果传递的数组不是整数类型数组。

  • 如果传递的索引超出类型数组的范围,则会出现 RangeError

示例

以下是实现 JavaScript Atomics 的代码 −

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.add(arr, 0, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // 创建一个 SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // 用 6 初始化数组第 0 个位置的元素
            arr[0] = 6;
            container.innerHTML = Atomics.add(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

输出

验证结果。

Atomics - notify() 方法

notify 方法通知等待的代理唤醒。notify 方法只能与使用 SharedArrayBuffer 创建的 Int32Array 一起使用。如果使用非共享 ArrayBuffer 对象,则返回 0。

语法

Atomics.notify(typedArray, index, count)

参数

  • typedArray 是一个共享的 Int32Array。

  • index 是 typedarray 中要唤醒的位置。

  • count 是要通知的休眠代理的数量。

返回

返回唤醒的代理数量。

异常

  • TypeError 如果传递的数组不是整数类型数组。

  • 如果传递的索引超出类型数组的范围,则会出现 RangeError

示例

以下是实现 JavaScript Atomics 的代码 −

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.store(arr, 0, 5)</p>
      <p>Atomics.notify(arr, 0, 1)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // 创建一个 SharedArrayBuffer
            var buffer = new SharedArrayBuffer(16);
            var arr = new Int32Array(buffer);
            // 用 6 初始化数组第 0 个位置的元素
            arr[0] = 6;            
            container.innerHTML = Atomics.store(arr, 0, 5) + '<br>' + Atomics.notify(arr, 0, 1);
         }
      </script>
   </body>
</html>

输出

验证结果。

Atomics - or() 方法

or 方法使用数组中给定位置的提供值计算按位或。它返回该位置的旧值。此原子操作可确保在修改后的值写回之前不会发生其他写入。

语法

Atomics.or(typedArray, index, value)

参数

  • typedArray 是整数类型数组。

  • index 是 typedarray 中的位置。

  • value 要与其进行按位或计算。

返回

返回给定位置的旧值。

异常

  • TypeError 如果传递的数组不是整数类型数组。

  • 如果传递的索引超出类型数组的范围,则会出现 RangeError

示例

以下是实现 JavaScript Atomics 的代码 −

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.or(arr, 0, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // 创建一个 SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // 用 6 初始化数组第 0 个位置的元素
            arr[0] = 6;
            //6 | 2 = 110 | 010 = 110 = 6
            container.innerHTML = Atomics.or(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

输出

验证结果。

Atomics - store() 方法

store 方法将值存储在数组中提供的位置并返回该值。此原子操作可确保在修改后的值被写回之前不会发生其他写入。

语法

Atomics.store(typedArray, index, value)

参数

  • typedArray 是整数类型数组。

  • index 是 typedarray 中要存储值的位置。

  • 要存储的值

返回

返回存储在给定位置的值。

异常

  • TypeError 如果传递的数组不是整数类型数组。

  • 如果传递的索引超出类型数组的范围,则会出现 RangeError

示例

以下是实现 JavaScript Atomics 的代码 −

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.store(arr, 0, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // 创建一个 SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // 用 6 初始化数组第 0 个位置的元素
            arr[0] = 6;           
            container.innerHTML = Atomics.store(arr, 0, 2) + '<br/>'
            + Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

输出

验证结果。

Atomics - sub() 方法

sub 方法在数组中的给定位置减去提供的值。它返回该位置的旧值。此原子操作可确保在修改后的值写回之前不会发生其他写入。

语法

Atomics.sub(typedArray, index, value)

参数

  • typedArray 是整数类型数组。

  • index 是 typedarray 中的位置。

  • 要减去的值

返回

返回给定位置的旧值。

异常

  • TypeError 如果传递的数组不是整数类型数组。

  • 如果传递的索引超出类型数组的范围,则会出现 RangeError

示例

以下是实现 JavaScript Atomics 的代码 −

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.sub(arr, 0, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // 创建一个 SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // 用 6 初始化数组第 0 个位置的元素
            arr[0] = 6;
            //6 - 2 = 4
            container.innerHTML = Atomics.sub(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

输出

验证结果。

Atomics - xor() 方法

xor 方法使用数组中给定位置的提供值计算按位异或。它返回该位置的旧值。此原子操作可确保在修改后的值写回之前不会发生其他写入。

语法

Atomics.xor(typedArray, index, value)

参数

  • typedArray 是整数类型数组。

  • index 是 typedarray 中的位置。

  • value 要与其进行按位 XOR 计算的值。

返回

返回给定位置的旧值。

异常

  • TypeError 如果传递的数组不是整数类型数组。

  • 如果传递的索引超出类型数组的范围,则会出现 RangeError

示例

以下是实现 JavaScript Atomics 的代码 −

<!DOCTYPE html>
<html lang="en">
   <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Atomics Example</title>
      <style>
         .result {
            font-size: 20px;
            border: 1px solid black;
         }
      </style>
   </head>
   <body onLoad="operate();">
      <h1>JavaScript Atomics Properties</h1>
      <div class="result"></div>
      <p>Atomics.xor(arr, 0, 2)</p>
      <p>Atomics.load(arr, 0)</p>
      <script>
         function operate(){
            let container = document.querySelector(".result");
            // 创建一个 SharedArrayBuffer
            var buffer = new SharedArrayBuffer(25);
            var arr = new Uint8Array(buffer);
            // 用 6 初始化数组第 0 个位置的元素
            arr[0] = 6;
            //6 xor 2 = 110 xor 010 = 100 = 4
            container.innerHTML = Atomics.xor(arr, 0, 2) + '<br/>' + Atomics.load(arr, 0);
         }
      </script>
   </body>
</html>

输出

验证结果。