Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript Atomics란 무엇인가? 원자적 연산의 개념과 Atomics.add() 사용법


Atomics란?

Atomics는 JavaScript에서 원자적(atomic) 연산을 정적(static) 메서드 형태로 제공하는 내장 객체입니다. Math 객체의 메서드처럼 Atomics의 모든 메서드와 속성도 정적으로 제공되며, 주로 SharedArrayBuffer 객체와 함께 사용됩니다.

원자적 연산은 Atomics 모듈에 구현되어 있습니다. 다른 전역 객체들과 달리 Atomics는 생성자(constructor)가 아니기 때문에 new 연산자와 함께 사용하거나 함수처럼 직접 호출할 수 없습니다.

원자적(Atomic) 연산이란?

원자적 연산은 중간에 중단될 수 없는 연산입니다. 여러 스레드가 메모리를 공유하는 환경에서는 여러 스레드가 동시에 같은 데이터를 읽거나 쓸 수 있는데, 이때 데이터가 임의로 변경되면 데이터 손실이나 예측 불가능한 결과가 발생할 수 있습니다.

원자적 연산은 예상된 값이 정확하게 쓰이고 읽히는 것을 보장합니다. 현재 진행 중인 연산이 완료되기 전까지는 다른 어떤 연산도 시작될 수 없으므로, 기존 데이터가 중간에 변경될 가능성이 없습니다. 이러한 특성 덕분에 멀티스레드 환경에서도 안전하게 공유 메모리를 다룰 수 있습니다.

이제 Atomics에서 제공하는 대표적인 메서드 중 하나를 살펴보겠습니다.

Atomics.add()

Atomics.add()는 배열의 지정된 위치에 주어진 값을 더하고, 해당 위치에 있던 이전 값을 반환합니다. 중단이 허용되지 않기 때문에 수정된 값이 반환되기 전까지는 다른 쓰기 작업이 끼어들 수 없습니다.

구문

Atomics.add(typedArray, index, value)

매개변수

typedArray

수정하려는 공유 정수형 배열(SharedArrayBuffer 기반의 TypedArray)입니다.

index

새로운 값을 더할 배열 내 위치(인덱스)입니다.

value

해당 위치에 더할 숫자 값입니다.

반환값

Atomics.add()는 지정된 위치(typedArray[index])에 저장되어 있던 이전 값을 반환합니다.

예제

<html>
<body>
<script type="text/javascript">
// SharedArrayBuffer 생성
var buffer = new SharedArrayBuffer(25);
var arr = new Uint8Array(buffer);
// 배열 0번째 위치의 요소를 6으로 초기화
arr[0] = 6;
// Atomics.add() 메서드의 반환값 출력
document.write(Atomics.add(arr, 0, 2));
document.write("</br>");
// 업데이트된 SharedArrayBuffer의 값 출력
document.write(Atomics.load(arr, 0));
</script>
</body>
</html>

출력 결과

6
8

위 예제에서 Atomics.add(arr, 0, 2)는 0번째 위치에 있던 기존 값 6을 먼저 반환하고, 그 자리에 2를 더해 8을 저장합니다. 이후 Atomics.load()로 확인하면 변경된 값 8이 출력되는 것을 볼 수 있습니다.

주요 Atomics 메서드 정리

Atomics 객체에는 add() 외에도 다양한 원자적 연산 메서드가 제공됩니다.

  • Atomics.load(): 지정된 위치의 값을 안전하게 읽어 반환합니다.
  • Atomics.store(): 지정된 위치에 값을 저장합니다.
  • Atomics.sub(): 지정된 위치의 값에서 주어진 값을 뺍니다.
  • Atomics.compareExchange(): 기존 값이 예상값과 일치할 때만 새 값으로 교환합니다.
  • Atomics.wait() / Atomics.notify(): 스레드 간 대기와 알림을 처리하여 동기화를 지원합니다.