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ốngMath). - Đả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ức | Mô 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/notify | Cơ 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 headerCross-Origin-Opener-PolicyvàCross-Origin-Embedder-Policytrên server. - Chủ yếu dùng trong Web Workers để xử lý song song nặng (image processing, crypto, game physics).