Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

Atomics trong JavaScript: Đa luồng an toàn

Atomics là đối tượng toàn cục cung cấp các phương thức tĩnh để thực hiện các thao tác nguyên tử (atomic operations) trên SharedArrayBuffer — cho phép chia sẻ bộ nhớ giữa các Web Worker (đa luồng).

Đặc điểm chính

  • Không phải constructor — không dùng new Atomics().
  • Tất cả phương thức đều static (giống Math).
  • Đảm bảo tính toàn vẹn dữ liệu khi nhiều luồng đọc/ghi cùng lúc.
  • Các thao tác không bị ngắt quãng (uninterruptible).

Tại sao cần Atomics?

Khi nhiều worker cùng truy cập SharedArrayBuffer, race condition có thể xảy ra: luồng A đọc, luồng B ghi, luồng A ghi đè → mất dữ liệu. Atomics đảm bảo: đọc-ghi hoàn tất trước khi luồng khác can thiệp.

Phương thức phổ biến

Phương thứcMô tả
Atomics.add(typedArray, index, value)Cộng value vào phần tử tại index, trả về giá trị cũ.
Atomics.load(typedArray, index)Đọc giá trị tại index (atomic read).
Atomics.store(typedArray, index, value)Ghi value tại index, trả về giá trị đã ghi.
Atomics.compareExchange(typedArray, index, expected, replacement)Nếu giá trị tại index = expected → thay bằng replacement. Trả về giá trị cũ.
Atomics.exchange(typedArray, index, value)Thay thế giá trị tại index, trả về giá trị cũ.
Atomics.wait/wake/notifyCơ chế đồng bộ hóa (futex-like) giữa các worker.

Ví dụ: Atomics.add()

<script>
  // Tạo SharedArrayBuffer 25 bytes
  const buffer = new SharedArrayBuffer(25);
  const arr = new Uint8Array(buffer); // Typed array view

  arr[0] = 6; // Giá trị ban đầu

  // Atomic add: arr[0] += 2, trả về giá trị cũ (6)
  const oldVal = Atomics.add(arr, 0, 2);
  document.write('Giá trị cũ: ' + oldVal + '<br>'); // 6
  document.write('Giá trị mới: ' + Atomics.load(arr, 0)); // 8
</script>

Kết quả

Giá trị cũ: 6
Giá trị mới: 8

Lưu ý quan trọng

  • Chỉ làm việc với Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, Uint32Array, BigInt64Array, BigUint64Array.
  • Yêu cầu SharedArrayBuffer — cần header Cross-Origin-Opener-Policy và Cross-Origin-Embedder-Policy trên server.
  • Chủ yếu dùng trong Web Workers để xử lý song song nặng (image processing, crypto, game physics).