This page was translated from English by the community. Learn more and join the MDN Web Docs community.

View in English Always switch to English

Atomics

Baseline Widely available *

This feature is well established and works across many devices and browser versions. Itโ€™s been available across browsers since โจ2021๋…„ 12์›”โฉ.

* Some parts of this feature may have varying levels of support.

Atomics ๊ฐ์ฒด๋Š” ์•„ํ† ๋ฏน ์—ฐ์‚ฐ(Atomic operation, ์›์ž์  ์—ฐ์‚ฐ)์„ ์ •์  ๋ฉ”์„œ๋“œ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. SharedArrayBuffer ์™€ ArrayBuffer ๊ฐ์ฒด์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์„ค๋ช…

์•„ํ† ๋ฏน ์—ฐ์‚ฐ์€ Atomic ๋ชจ๋“ˆ์— ์„ค์น˜๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ „์—ญ ๊ฐ์ฒด์™€ ๋‹ฌ๋ฆฌ Atomics๋Š” ์ƒ์„ฑ์ž๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—, new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ Atomics ๊ฐ์ฒด๋ฅผ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Math ๊ฐ์ฒด์ฒ˜๋Ÿผ Atomics์˜ ๋ชจ๋“  ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋Š” ์ •์ ์ž…๋‹ˆ๋‹ค.

์•„ํ† ๋ฏน ์—ฐ์‚ฐ

๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ณต์œ ๋˜๋ฉด ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„ํ† ๋ฏน ์—ฐ์‚ฐ์€ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๊ฐ’์„ ์“ฐ๊ณ  ์ฝ๊ณ , ๋‹ค์Œ ์—ฐ์‚ฐ์ด ์‹œ์ž‘๋˜๊ธฐ ์ „์— ์—ฐ์‚ฐ์„ ์™„๋ฃŒํ•˜์—ฌ ์—ฐ์‚ฐ์ด ์ค‘๋‹จ๋˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

Wait์™€ notify

wait()์™€ notify() ๋ฉ”์„œ๋“œ๋Š” Linux ํ“จํ…์Šค(futex)("๋น ๋ฅธ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„ ๋ฎคํ…์Šค(mutex)")์—์„œ ๋ชจ๋ธ๋ง๋˜์–ด ํŠน์ • ์กฐ๊ฑด์ด ์ฐธ์ด ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์ฐจ๋‹จ ๊ตฌ๋ฌธ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ •์  ์†์„ฑ

Atomics[@@toStringTag]

@@toStringTag ์†์„ฑ์˜ ์ดˆ๊ธฐ ๊ฐ’์€ "Atomics" ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ์ด ์†์„ฑ์€ Object.prototype.toString()์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ •์  ๋ฉ”์„œ๋“œ

Atomics.add()

๋ฐฐ์—ด์˜ ํŠน์ • ์ธ๋ฑ์Šค์— ์žˆ๋˜ ๊ฐ’์— ์ „๋‹ฌ๋œ ๊ฐ’์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ธ๋ฑ์Šค์˜ ์ด์ „ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Atomics.and()

์ „๋‹ฌ๋œ ๊ฐ’๊ณผ ๋ฐฐ์—ด์˜ ์ง€์ •๋œ ์ธ๋ฑ์Šค์— ์žˆ๋Š” ๊ฐ’์œผ๋กœ AND ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ธ๋ฑ์Šค์˜ ์ด์ „ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Atomics.compareExchange()

๋ฐฐ์—ด์˜ ์ง€์ •๋œ ์ธ๋ฑ์Šค ๊ฐ’๊ณผ ๊ฐ™์œผ๋ฉด ๊ทธ๊ณณ์— ๊ฐ’์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Atomics.exchange()

๋ฐฐ์—ด์˜ ์ง€์ •๋œ ์œ„์น˜์— ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Atomics.isLockFree(size)

์ž ๊ธˆ ๋˜๋Š” atomic ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์ ํ™” ๊ธฐ๋ณธ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ์š”์†Œ ํฌ๊ธฐ์˜ ๋ฐฐ์—ด์— ๋Œ€ํ•œ atomic ์—ฐ์‚ฐ์ด ํ•˜๋“œ์›จ์–ด atomic ์—ฐ์‚ฐ(์ž ๊ธˆ๊ณผ ๋ฐ˜๋Œ€)์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋˜๋Š” ๊ฒฝ์šฐ true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ „๋ฌธ๊ฐ€๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Atomics.load()

๋ฐฐ์—ด์˜ ์ง€์ •๋œ ์œ„์น˜์— ์žˆ๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Atomics.notify()

๋ฐฐ์—ด์˜ ์ง€์ •๋œ ์ธ๋ฑ์Šค์—์„œ ๋Œ€๊ธฐ ์ค‘์ธ ์—์ด์ „ํŠธ์— ์•Œ๋ฆฝ๋‹ˆ๋‹ค. ์•Œ๋ฆผ์„ ๋ฐ›์€ ์—์ด์ „ํŠธ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Atomics.or()

์ „๋‹ฌ๋œ ๊ฐ’๊ณผ ๋ฐฐ์—ด์˜ ์ง€์ •๋œ ์ธ๋ฑ์Šค์— ์žˆ๋Š” ๊ฐ’์œผ๋กœ OR ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ธ๋ฑ์Šค์˜ ์ด์ „ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Atomics.store()

๋ฐฐ์—ด์˜ ์ง€์ •๋œ ์ธ๋ฑ์Šค์— ๊ฐ’์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Atomics.sub()

๋ฐฐ์—ด์˜ ์ง€์ •๋œ ์ธ๋ฑ์Šค์—์„œ ๊ฐ’์„ ๋บ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ธ๋ฑ์Šค์˜ ์ด์ „ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Atomics.wait()

๋ฐฐ์—ด์˜ ์ง€์ •๋œ ์ธ๋ฑ์Šค๊ฐ€ ์—ฌ์ „ํžˆ ๊ฐ’์„ ํฌํ•จํ•˜๊ณ ์žˆ๊ณ  ๋Œ€๊ธฐ ์ค‘์ด๊ฑฐ๋‚˜ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. "ok", "not-equal" ๋˜๋Š” "timed-out"์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ ์—์ด์ „ํŠธ์—์„œ ๋Œ€๊ธฐ๊ฐ€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์œผ๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. (๋Œ€๋ถ€๋ถ„์˜ ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ wait()์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

Atomics.waitAsync()

๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜์—์„œ ๋น„๋™๊ธฐ์‹์œผ๋กœ(์ฆ‰, Atomics.wait์™€ ๋‹ค๋ฅด๊ฒŒ ์ฐจ๋‹จ ์—†์ด) ๋Œ€๊ธฐํ•˜๊ณ  ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Atomics.xor()

์ œ๊ณต๋œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์˜ ์ง€์ •๋œ ์ธ๋ฑ์Šค์— ์žˆ๋Š” ๊ฐ’์— ๋Œ€ํ•ด XOR ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ธ๋ฑ์Šค์˜ ์ด์ „ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ

Atomic ์‚ฌ์šฉํ•˜๊ธฐ

js
const sab = new SharedArrayBuffer(1024);
const ta = new Uint8Array(sab);

ta[0]; // 0
ta[0] = 5; // 5

Atomics.add(ta, 0, 12); // 5
Atomics.load(ta, 0); // 17

Atomics.and(ta, 0, 1); // 17
Atomics.load(ta, 0); // 1

Atomics.compareExchange(ta, 0, 5, 12); // 1
Atomics.load(ta, 0); // 1

Atomics.exchange(ta, 0, 12); // 1
Atomics.load(ta, 0); // 12

Atomics.isLockFree(1); // true
Atomics.isLockFree(2); // true
Atomics.isLockFree(3); // false
Atomics.isLockFree(4); // true

Atomics.or(ta, 0, 1); // 12
Atomics.load(ta, 0); // 13

Atomics.store(ta, 0, 12); // 12

Atomics.sub(ta, 0, 2); // 12
Atomics.load(ta, 0); // 10

Atomics.xor(ta, 0, 1); // 10
Atomics.load(ta, 0); // 11

Waiting๊ณผ notifying

Int32Array๋ฅผ ๊ณต์œ ํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ

js
const sab = new SharedArrayBuffer(1024);
const int32 = new Int32Array(sab);

์ฝ๊ธฐ ์Šค๋ ˆ๋“œ๋Š” 0์ด ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ์œ„์น˜ 0์—์„œ sleep ์ƒํƒœ์ด๋ฉฐ ๋Œ€๊ธฐ ์ค‘์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์‚ฌ์‹ค์ธ ํ•œ ๊ณ„์†๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์“ฐ๊ธฐ ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒˆ ๊ฐ’์„ ์ €์žฅํ•˜๋ฉด ์“ฐ๊ธฐ ์Šค๋ ˆ๋“œ์—์„œ ์ด๋ฅผ ์•Œ๋ฆฌ๊ณ  ์ƒˆ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. (123)

js
Atomics.wait(int32, 0, 0);
console.log(int32[0]); // 123

์“ฐ๊ธฐ ์Šค๋ ˆ๋“œ๋Š” ์ƒˆ ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ๋Œ€๊ธฐ ์ค‘์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž‘์„ฑ๋˜๋ฉด ์•Œ๋ฆฝ๋‹ˆ๋‹ค.

js
console.log(int32[0]); // 0;
Atomics.store(int32, 0, 123);
Atomics.notify(int32, 0, 1);

๋ช…์„ธ์„œ

Specification
ECMAScriptยฎ 2026 Language Specification
# sec-atomics-object

๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ

๊ฐ™์ด ๋ณด๊ธฐ