Atomics 객체

seungjun.dev·2025년 7월 26일

JavaScript

목록 보기
4/8
post-thumbnail

레이스 컨디션을 방지하고, 동기화의 방법 중 하나인 원자적 연산을 보장하기 위한 정적 메소드들의 집합
동기화 기법 글 보러 가기

  • 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

참고하면 좋은 자료

JS로 구현한 레이스 컨디션과 원자적 연산 시뮬레이터

profile
Web FE Dev | Microsoft Student Ambassadors Alumni

0개의 댓글