Atomics.compareExchange()

Baseline 已廣泛支援

此功能已成熟,可在多種裝置和瀏覽器版本上使用。自 2021 年 12 月以來,它已在所有瀏覽器中可用。

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

一個整數型別化陣列。可以是 Int8ArrayUint8ArrayInt16ArrayUint16ArrayInt32ArrayUint32ArrayBigInt64ArrayBigUint64Array 中的一種。

index

要在 typedArray 中交換 replacementValue 的位置。

expectedValue

要進行相等性檢查的值。

replacementValue

要交換的數字。

返回值

給定位置 (typedArray[index]) 的舊值。如果返回值等於 expectedValue,則交換成功;否則,交換失敗。

異常

TypeError

如果 typedArray 不是允許的整數型別之一,則丟擲。

RangeError

如果 indextypedArray 中超出界限,則丟擲。

示例

使用 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

瀏覽器相容性

另見