JavaScript의 Atomics 객체는 add(더하기), sub(빼기), and, or, xor, load(읽기), store(쓰기) 등 다양한 원자적(atomic) 연산을 정적 메서드 형태로 제공하는 객체입니다. 이 메서드들은 SharedArrayBuffer 객체와 함께 사용되며, 여러 스레드가 동시에 공유 메모리에 접근할 때 발생할 수 있는 데이터 충돌 없이 안전하게 연산을 수행하도록 도와줍니다.
Atomics.load() 함수는 타입 배열(Typed Array)에서 지정된 인덱스 위치에 저장된 값을 읽어 반환합니다. 일반적인 배열 접근 방식과 달리 원자적으로 동작하기 때문에, 멀티스레드 환경에서도 일관성 있는 값을 보장받을 수 있습니다.
구문(Syntax)
Atomics.load(typedArray, index)
- typedArray: SharedArrayBuffer를 기반으로 생성된 타입 배열(Uint8Array, Int32Array 등)
- index: 값을 읽어올 배열 내 위치(인덱스)
예제 1
<html> <head> <title>JavaScript Example</title> </head> <body> <script type="text/javascript"> var arrayBuffer = new SharedArrayBuffer(16); var data = new Uint8Array(arrayBuffer); data[0] = 20; Atomics.add(data, 0, 30); document.write(Atomics.load(data, 0)); </script> </body> </html>
출력 결과
50
위 예제에서는 먼저 data[0]에 20을 저장한 뒤, Atomics.add()를 통해 30을 더했습니다. 그리고 Atomics.load()로 해당 위치의 최종 값인 50을 읽어 화면에 출력합니다.
예제 2
<html>
<head>
<title>JavaScript Example</title>
</head>
<body>
<script type="text/javascript">
var arrayBuffer = new SharedArrayBuffer(16);
var data = new Uint8Array(arrayBuffer);
data[0] = 3;
document.write(Atomics.add(data, 0, 3));
document.write(", "+Atomics.load(data, 0));
</script>
</body>
</html>출력 결과
3, 6
두 번째 예제는 data[0]에 3을 저장한 상태에서 Atomics.add()를 호출합니다. 이때 add()는 덧셈이 적용되기 이전의 값(3)을 반환하며, 이후 Atomics.load()를 통해 변경된 최종 값(6)을 확인할 수 있습니다.