Atomics 객체란 무엇인가?
자바스크립트의 Atomics 객체는 add(덧셈), sub(뺄셈), and, or, xor, load(읽기), store(쓰기) 등과 같은 원자적(atomic) 연산을 정적 메서드 형태로 제공하는 내장 객체입니다. 이러한 메서드들은 SharedArrayBuffer 객체와 함께 사용되며, 여러 스레드가 동시에 동일한 메모리에 접근할 때 발생할 수 있는 경합 조건(race condition)을 방지하여 데이터의 일관성을 보장합니다.
Atomics.xor() 함수의 역할
xor() 함수는 숫자 값과 위치(인덱스)를 인수로 받아, 지정된 위치의 배열 요소에 대해 비트 단위 XOR 연산을 수행합니다. 반환값으로는 연산이 적용되기 전의 기존 값(old value)을 돌려주며, 배열 자체에는 연산 결과인 새로운 값이 저장됩니다.
문법(Syntax)
기본적인 사용 형식은 다음과 같습니다.
Atomics.xor(typedArray, index, value)
- typedArray: SharedArrayBuffer를 기반으로 생성된 Int8Array, Uint8Array 등의 타입 배열
- index: XOR 연산을 수행할 배열 내 위치
- value: XOR 연산에 사용할 숫자 값
예제(Example)
<html>
<head>
<title>JavaScript Example</title>
</head>
<body>
<script type="text/javascript">
var arrayBuffer = new SharedArrayBuffer(16);
var data = new Uint8Array(arrayBuffer);
data[0] = 30;
document.write(Atomics.xor(data, 0, 3));
document.write(", "+Atomics.load(data, 0));
</script>
</body>
</html>출력 결과(Output)
30, 29
동작 원리 상세 설명
위 예제에서 data[0]의 초기값은 30입니다. Atomics.xor(data, 0, 3) 호출 시 내부적으로 다음 과정이 진행됩니다.
- 30을 이진수로 표현하면 11110입니다.
- 3을 이진수로 표현하면 00011입니다.
- 두 값을 XOR 연산하면 11101, 즉 십진수로 29가 됩니다.
함수는 먼저 변경 전 값인 30을 반환하고, 이후 Atomics.load(data, 0)로 배열 값을 다시 읽어보면 연산 결과인 29가 저장되어 있음을 확인할 수 있습니다. 이처럼 Atomics.xor()는 값을 교체하기 전의 원본 값을 안전하게 반환해 주기 때문에, 멀티스레드 환경에서도 신뢰할 수 있는 비트 연산 처리가 가능합니다.