Đối tượng Atomics cung cấp các thao tác số học và bitwise nguyên tử cho SharedArrayBuffer. Phương thức Atomics.add() cộng một giá trị vào phần tử tại vị trí chỉ định và trả về giá trị cũ tại vị trí đó.
Cú pháp
Atomics.add(typedArray, index, value)
typedArray: Mảng kiểu số nguyên (Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, Uint32Array, BigInt64Array, BigUint64Array)index: Vị trí trong mảngvalue: Giá trị cần cộng
Ví dụ cơ bản
const buffer = new SharedArrayBuffer(16);
const data = new Uint8Array(buffer);
data[0] = 3;
console.log(Atomics.add(data, 0, 3)); // 3 (giá trị cũ)
console.log(Atomics.load(data, 0)); // 6 (giá trị mới: 3 + 3)
Ứng dụng: Bộ đếm nguyên tử (Atomic Counter)
const buffer = new SharedArrayBuffer(4);
const counter = new Int32Array(buffer);
// Luồng 1
function increment() {
const old = Atomics.add(counter, 0, 1);
console.log(`Tăng từ ${old} thành ${old + 1}`);
}
// Luồng 2 có thể gọi increment() đồng thời an toàn
Đặc điểm quan trọng
- Nguyên tử: Cộng và ghi lại là một thao tác không thể chia cắt
- Trả về giá trị trước khi cộng (khác với hành vi thông thường)
- Hỗ trợ tràn số (overflow) theo quy tắc bù 2 của kiểu dữ liệu
- Cơ sở để xây dựng: semaphore, mutex, reference counting
Lưu ý
- Chỉ hoạt động với
SharedArrayBuffer - Không hỗ trợ Float32Array, Float64Array
- Kết hợp với
Atomics.load()để đọc giá trị hiện tại an toàn