Atomics.compareExchange()
Atomics.compareExchange() 靜態方法會在陣列的給定位置,如果給定的預期值等於舊值,則將給定的替換值進行交換。無論返回值是否等於預期值,它都會返回該位置的舊值。此原子操作確保在修改後的值寫回之前,不會發生其他寫入操作。
試一試
// Create a SharedArrayBuffer with a size in bytes
const buffer = new SharedArrayBuffer(16);
const uint8 = new Uint8Array(buffer);
uint8[0] = 5;
Atomics.compareExchange(uint8, 0, 5, 2); // Returns 5
console.log(Atomics.load(uint8, 0));
// Expected output: 2
Atomics.compareExchange(uint8, 0, 5, 4); // Returns 2
console.log(Atomics.load(uint8, 0));
// Expected output: 2
語法
js
Atomics.compareExchange(typedArray, index, expectedValue, replacementValue)
引數
typedArray-
一個整數型別化陣列。可以是
Int8Array、Uint8Array、Int16Array、Uint16Array、Int32Array、Uint32Array、BigInt64Array或BigUint64Array中的一種。 index-
要在
typedArray中交換replacementValue的位置。 expectedValue-
要進行相等性檢查的值。
replacementValue-
要交換的數字。
返回值
給定位置 (typedArray[index]) 的舊值。如果返回值等於 expectedValue,則交換成功;否則,交換失敗。
異常
TypeError-
如果
typedArray不是允許的整數型別之一,則丟擲。 RangeError-
如果
index在typedArray中超出界限,則丟擲。
示例
使用 compareExchange()
js
const sab = new SharedArrayBuffer(1024);
const ta = new Uint8Array(sab);
ta[0] = 7;
Atomics.compareExchange(ta, 0, 7, 12); // returns 7, the old value
Atomics.load(ta, 0); // 12
檢查返回值
比較並交換(Compare-and-swap)可確保新值基於最新資訊計算;如果值在此期間已被另一個執行緒更新,則寫入將失敗。因此,您應該檢查 compareExchange() 的返回值以確定是否失敗,並在必要時重試。
下面是一個原子加法器的示例(功能與 Atomics.add() 相同),改編自引用的維基百科文章。
js
function add(mem, index, a) {
let done = false;
while (!done) {
const value = Atomics.load(mem, index);
done = Atomics.compareExchange(mem, index, value, value + a) === value;
}
return value + a;
}
它首先讀取給定索引處的值,然後嘗試用新值更新它。它會一直重試,直到成功更新該值。
規範
| 規範 |
|---|
| ECMAScript® 2026 語言規範 # sec-atomics.compareexchange |
瀏覽器相容性
載入中…