
레이스 컨디션을 방지하고, 동기화의 방법 중 하나인 원자적 연산을 보장하기 위한 정적 메소드들의 집합
동기화 기법 글 보러 가기
Atomics는 생성자가 아니므로 new로 인스턴스를 만들 수 없다Atomics.add()와 같이 정적 메서드로 직접 호출한다| 용도 | 메서드 | 동작 |
|---|---|---|
| 데이터 읽기 및 쓰기 | Atomics.load(typedArray, index) | 지정된 위치의 값을 원자적으로 읽는다. 다른 스레드가 값을 쓰는 도중에 읽는 것을 방지해서 항상 완전한 값을 보장한다. |
Atomics.store(typedArray, index, value) | 지정된 위치에 값을 원자적으로 저장한다. 값을 저장하는 중간에 다른 스레드가 끼어들 수 없다. | |
Atomics.exchange(typedArray, index, value) | 지정된 위치에 새 값을 원자적으로 저장하고, 그 위치에 있던 이전 값을 반환 | |
| 원자적 산술 및 비트 연산 | Atomics.add(typedArray, index, value) | 지정된 위치의 값에 value를 원자적으로 더하고, 이전 값을 반환 |
Atomics.sub(typedArray, index, value) | 지정된 위치의 값에서 value를 원자적으로 빼고, 이전 값을 반환 | |
Atomics.and(typedArray, index, value) | 지정된 위치의 값과 value로 비트 AND(&) 연산을 원자적으로 수행하고, 이전 값을 반환 | |
Atomics.or(typedArray, index, value) | 지정된 위치의 값과 value로 비트 OR(|) 연산을 원자적으로 수행하고, 이전 값을 반환 | |
Atomics.xor(typedArray, index, value) | 지정된 위치의 값과 value로 비트 XOR(^) 연산을 원자적으로 수행하고, 이전 값을 반환 | |
| 조건부 수정 | Atomics.compareExchange(arr, i, oldVal, newVal) | 지정된 위치의 값이 oldVal과 일치하면 newVal로 원자적으로 교체한다.교체 성공 여부와 관계없이 항상 이전 값을 반환하여 성공 여부를 확인할 수 있다. |
| 스레드 동기화 (대기 및 알림) | Atomics.wait(typedArray, index, value, timeout?) | 지정된 위치의 값이 value이면 스레드를 대기 상태로 만든다. notify() 호출이나 timeout이 지나면 깨어난다. (메인 스레드에서는 사용 불가) |
Atomics.notify(typedArray, index, count?) | 지정된 위치에서 대기 중인 스레드를 count(기본값: 무한)만큼 깨운다. 깨운 스레드의 수를 반환합니다. |
// 1. 여러 워커가 공유할 메모리 공간을 생성합니다.
const sharedBuffer = new SharedArrayBuffer(16); // 16바이트 크기의 공유 메모리
// 2. 해당 메모리를 32비트 정수 배열로 다룰 수 있도록 뷰(view)를 생성합니다.
const int32Array = new Int32Array(sharedBuffer);
// --- 워커 1 또는 메인 스레드 ---
// 0번 인덱스에 원자적으로 값 10을 저장합니다.
Atomics.store(int32Array, 0, 10);
// --- 워커 2 ---
// 0번 인덱스의 값에 5를 원자적으로 더합니다.
// 이 연산은 중간에 다른 스레드의 방해를 받지 않습니다.
const oldValue = Atomics.add(int32Array, 0, 5);
console.log(`이전 값: ${oldValue}`); // 출력: 이전 값: 10
// --- 워커 3 ---
// 현재 값을 원자적으로 읽어옵니다.
const currentValue = Atomics.load(int32Array, 0);
console.log(`현재 값: ${currentValue}`); // 출력: 현재 값: 15