描述
與大多數全域性物件不同,Atomics 不是建構函式。您不能將其與 new 運算子 一起使用,也不能將 Atomics 物件呼叫為函式。Atomics 的所有屬性和方法都是靜態的(就像 Math 物件一樣)。
原子操作
當記憶體被共享時,多個執行緒可以讀寫記憶體中的相同資料。原子操作確保寫入和讀取的值是可預測的,操作在下一個操作開始之前完成,並且操作不會被中斷。
等待和通知
wait() 和 notify() 方法模仿了 Linux futexes(“快速使用者空間互斥鎖”)並提供了等待特定條件成立的方法,通常用作阻塞構造。
靜態屬性
Atomics[Symbol.toStringTag]-
[Symbol.toStringTag]屬性的初始值為字串"Atomics"。此屬性用於Object.prototype.toString()。
靜態方法
Atomics.add()-
將提供的值新增到陣列指定索引處的現有值。返回該索引處的舊值。
Atomics.and()-
計算陣列指定索引處的位值與提供的值之間的按位 AND。返回該索引處的舊值。
Atomics.compareExchange()-
如果陣列指定索引處的值等於給定值,則將該值儲存到該索引處。返回舊值。
Atomics.exchange()-
將值儲存到陣列指定索引處。返回舊值。
Atomics.isLockFree()-
一種最佳化原語,可用於確定是使用鎖還是原子操作。如果對給定元素大小的陣列進行原子操作將使用硬體原子操作(而不是鎖)來實現,則返回
true。僅限專家。 Atomics.load()-
返回陣列指定索引處的值。
Atomics.notify()-
通知正在等待陣列指定索引的代理。返回被通知的代理數量。
Atomics.or()-
計算陣列指定索引處的位值與提供的值之間的按位 OR。返回該索引處的舊值。
Atomics.pause()-
提供微等待原語,提示 CPU 呼叫者正在忙等待訪問共享資源。這使得系統可以減少分配給核心(例如電源)或執行緒的資源,而無需放棄當前執行緒。
Atomics.store()-
將值儲存到陣列指定索引處。返回該值。
Atomics.sub()-
從陣列指定索引處的值減去一個值。返回該索引處的舊值。
Atomics.wait()-
驗證陣列指定索引處的值是否仍然是給定值,然後休眠等待或超時。返回
"ok"、"not-equal"或"timed-out"。如果在呼叫代理中不允許等待,則會丟擲異常。(大多數瀏覽器不允許在瀏覽器的主執行緒上使用wait()。) Atomics.waitAsync()-
非同步等待(即,不阻塞,與
Atomics.wait不同)共享記憶體位置,並返回一個表示操作結果的物件。 Atomics.xor()-
計算陣列指定索引處的位值與提供的值之間的按位 XOR。返回該索引處的舊值。
示例
使用 Atomics
const sab = new SharedArrayBuffer(1024);
const ta = new Uint8Array(sab);
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.compareExchange(ta, 0, 5, 12); // 1
Atomics.load(ta, 0); // 1
Atomics.exchange(ta, 0, 12); // 1
Atomics.load(ta, 0); // 12
Atomics.isLockFree(1); // true
Atomics.isLockFree(2); // true
Atomics.isLockFree(3); // false
Atomics.isLockFree(4); // 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
等待和通知
給定一個共享的 Int32Array
const sab = new SharedArrayBuffer(1024);
const int32 = new Int32Array(sab);
讀取執行緒正在位置 0 休眠並等待,因為提供的值與提供索引處儲存的值匹配。讀取執行緒不會繼續,直到寫入執行緒呼叫了對提供的型別化陣列位置 0 的 Atomics.notify()。請注意,如果在喚醒後,位置 0 的值未被寫入執行緒更改,則讀取執行緒**不會**重新休眠,而是會繼續執行。
Atomics.wait(int32, 0, 0);
console.log(int32[0]); // 123
寫入執行緒儲存一個新值,並在寫入後通知等待執行緒
console.log(int32[0]); // 0;
Atomics.store(int32, 0, 123);
Atomics.notify(int32, 0, 1);
規範
| 規範 |
|---|
| ECMAScript® 2026 語言規範 # sec-atomics-object |
瀏覽器相容性
載入中…
另見
ArrayBuffer- JavaScript 型別化陣列指南
- Web Workers
- TC39 ecmascript-sharedmem 提案中的 共享記憶體 – 簡要教程
- hacks.mozilla.org 上的 JavaScript 新並行原語初體驗 (2016)