JavaScript 中的原子
Atomics: Atomics 是一个 JavaScript 对象,它使原子任务作为静态策略进行。与 Math 对象的策略非常相似,Atomics 的技术和属性也是静态的。原子与 SharedArrayBuffer 对象一起使用。原子活动是在原子模块上介绍的。与其他全球文章相比,Atomics 不是构造函数。原子不能与其他管理员一起使用,也不能作为一种能力被召唤。
原子操作:原子操作不是连续的。当内存共享时,多个线程可以在内存中读取和写入数据。如果任何数据发生更改,则会丢失数据 原子操作确保数据被预测值写入和准确读取。在当前操作完成并且原子操作将开始之前,无法更改现有信息。
方法:
- 原子.add(): 将提供的值添加到指定数组索引中的当前值。返回旧的索引值。
- 原子.and(): 值 AND 是根据提供的值指定的数组的索引按位计算的。返回该索引的旧值。
- 原子交换(): 在指定的数组索引处指定一个值。返回旧值。
- Atomics.compareExchange(): 如果值相同,则指定指定数组索引中的值。旧值返回。
- Atomics.isLockFree(大小): 用于确定是否要使用锁或原子操作的原始优化。如果在给定元素大小的数组中执行硬件原子操作(与锁相反),则返回 true。
- 原子加载(): 该值返回到指定的数组索引。
- Atomics.or():按位或计算指定数组索引处给定值的值。返回旧的索引值。
- Atomics.notify(): 通知代理等待指定的数组索引。返回通知的代理数量。
- 原子.sub(): 删除指定数组索引处的值。返回旧的索引值。
- 原子商店(): 在指定的数组索引上保存一个值。返回值。
- 原子。等待(): 验证指定的数组索引是否仍有值,并且等待或等待时间处于休眠状态。返回“ok”、“not the same”或“time-out”。如果调用代理无法等待,它会抛出一个错误异常。
- 原子.xor(): 用给定数组索引上的给定值计算按位异或。返回旧的索引值。
示例 1:
Javascript
var buffer = new
// create a SharedArrayBuffer
SharedArrayBuffer(50);
var a = new Uint8Array(buffer);
// Initialising element at zeroth position of array with 9
a[0] = 9;
console.log(Atomics.load(a, 0));
// Displaying the return value of the Atomics.store() method
console.log(Atomics.store(a, 0, 3));
// Displaying the updated SharedArrayBuffer
console.log(Atomics.load(a, 0));
Javascript
const buffer = new SharedArrayBuffer(2048);
const ta = new Uint8Array(buffer);
ta[0]; // 0
ta[0] = 5; // 5
Atomics.add(ta, 0, 12); // 5
Atomics.load(ta, 0); // 17
Atomics.and(ta, 0, 1); // 17
Atomics.load(ta, 0); // 1
Atomics.exchange(ta, 0, 12); // 1
Atomics.load(ta, 0); // 12
Atomics.compareExchange(ta, 0, 5, 12); // 1
Atomics.load(ta, 0); // 1
Atomics.isLockFree(1); // true
Atomics.isLockFree(2); // true
Atomics.or(ta, 0, 1); // 12
Atomics.load(ta, 0); // 13
Atomics.store(ta, 0, 12); // 12
Atomics.sub(ta, 0, 2); // 12
Atomics.load(ta, 0); // 10
Atomics.xor(ta, 0, 1); // 10
Atomics.load(ta, 0); // 11
输出:
933
示例 2:
Javascript
const buffer = new SharedArrayBuffer(2048);
const ta = new Uint8Array(buffer);
ta[0]; // 0
ta[0] = 5; // 5
Atomics.add(ta, 0, 12); // 5
Atomics.load(ta, 0); // 17
Atomics.and(ta, 0, 1); // 17
Atomics.load(ta, 0); // 1
Atomics.exchange(ta, 0, 12); // 1
Atomics.load(ta, 0); // 12
Atomics.compareExchange(ta, 0, 5, 12); // 1
Atomics.load(ta, 0); // 1
Atomics.isLockFree(1); // true
Atomics.isLockFree(2); // true
Atomics.or(ta, 0, 1); // 12
Atomics.load(ta, 0); // 13
Atomics.store(ta, 0, 12); // 12
Atomics.sub(ta, 0, 2); // 12
Atomics.load(ta, 0); // 10
Atomics.xor(ta, 0, 1); // 10
Atomics.load(ta, 0); // 11
输出:
5
17
17
1
1
12
1
1
True
True
13
13
12
12
10
10