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 ์ฌ์ฉํ๊ธฐ
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
๋ฅผ ๊ณต์ ํ๋ค๊ณ ํ์ ๋
const sab = new SharedArrayBuffer(1024);
const int32 = new Int32Array(sab);
์ฝ๊ธฐ ์ค๋ ๋๋ 0์ด ๋ ๊ฒ์ผ๋ก ์์๋๋ ์์น 0์์ sleep ์ํ์ด๋ฉฐ ๋๊ธฐ ์ค์ ๋๋ค. ์ด๊ฒ์ด ์ฌ์ค์ธ ํ ๊ณ์๋์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๊ธฐ ์ค๋ ๋๊ฐ ์ ๊ฐ์ ์ ์ฅํ๋ฉด ์ฐ๊ธฐ ์ค๋ ๋์์ ์ด๋ฅผ ์๋ฆฌ๊ณ ์ ๊ฐ์ ๋ฐํํฉ๋๋ค. (123)
Atomics.wait(int32, 0, 0);
console.log(int32[0]); // 123
์ฐ๊ธฐ ์ค๋ ๋๋ ์ ๊ฐ์ ์ ์ฅํ๊ณ ๋๊ธฐ ์ค์ธ ์ค๋ ๋๊ฐ ์์ฑ๋๋ฉด ์๋ฆฝ๋๋ค.
console.log(int32[0]); // 0;
Atomics.store(int32, 0, 123);
Atomics.notify(int32, 0, 1);
๋ช ์ธ์
Specification |
---|
ECMAScriptยฎ 2026 Language Specification # sec-atomics-object |
๋ธ๋ผ์ฐ์ ํธํ์ฑ
Loadingโฆ
๊ฐ์ด ๋ณด๊ธฐ
ArrayBuffer
- JavaScript ํ์ํ ๋ฐฐ์ด
- ์น ์์ปค
- parlib-simple โ ๋๊ธฐํ ๋ฐ ์์ ๋ฐฐํฌ ์ถ์ํ๋ฅผ ์ ๊ณตํ๋ ๊ฐ๋จํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
- Shared Memory โ a brief tutorial
- A Taste of JavaScript's New Parallel Primitives โ Mozilla Hacks