$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Atomics APIを知る / Understanding Atomics API
Search
TOMIKAWA Sotaro
November 15, 2025
Programming
1
250
Atomics APIを知る / Understanding Atomics API
TOMIKAWA Sotaro
November 15, 2025
Tweet
Share
More Decks by TOMIKAWA Sotaro
See All by TOMIKAWA Sotaro
なんでRustの環境構築してないのにRust製のツールが動くの? / Why Do Rust-Based Tools Run Without a Rust Environment?
ssssota
15
49k
Web技術を最大限活用してRAW画像を現像する / Developing RAW Images on the Web
ssssota
2
2.4k
漸進。
ssssota
0
3.2k
Preact、HooksとSignalsの両立 / Preact: Harmonizing Hooks and Signals
ssssota
1
3.1k
useSyncExternalStoreを使いまくる
ssssota
6
6.2k
React CompilerとFine Grained Reactivityと宣言的UIのこれから / The next chapter of declarative UI
ssssota
8
5.6k
新しいAPI createRawSnippet触ってみた / What is the createRawSnippet?
ssssota
2
250
脱法Svelte / Evasion of svelte rules
ssssota
1
270
Documentation testsの恩恵 / Documentation testing benefits
ssssota
2
1.1k
Other Decks in Programming
See All in Programming
Why Kotlin? 電子カルテを Kotlin で開発する理由 / Why Kotlin? at Henry
agatan
2
6.2k
新卒エンジニアのプルリクエスト with AI駆動
fukunaga2025
0
140
テストやOSS開発に役立つSetup PHP Action
matsuo_atsushi
0
140
Microservices rules: What good looks like
cer
PRO
0
540
dnx で実行できるコマンド、作ってみました
tomohisa
0
130
分散DBって何者なんだ... Spannerから学ぶRDBとの違い
iwashi623
0
170
tsgolintはいかにしてtypescript-goの非公開APIを呼び出しているのか
syumai
5
1.1k
Microservices Platforms: When Team Topologies Meets Microservices Patterns
cer
PRO
1
910
TVerのWeb内製化 - 開発スピードと品質を両立させるまでの道のり
techtver
PRO
3
1.4k
20251127_ぼっちのための懇親会対策会議
kokamoto01_metaps
2
400
ソフトウェア設計の課題・原則・実践技法
masuda220
PRO
24
21k
手軽に積ん読を増やすには?/読みたい本と付き合うには?
o0h
PRO
1
140
Featured
See All Featured
Unsuck your backbone
ammeep
671
58k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Documentation Writing (for coders)
carmenintech
76
5.2k
Build The Right Thing And Hit Your Dates
maggiecrowley
38
3k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.5k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
140
34k
Automating Front-end Workflow
addyosmani
1371
200k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
285
14k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
46
7.8k
4 Signs Your Business is Dying
shpigford
186
22k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.8k
Transcript
Atomics APIを知る sssssota / #jsconfjp
⾃⼰紹介 ssssota (冨川宗太郎) sは4つ / テックリード {x:"ssssotaro",gh:"ssssota"} フロカン北海道 → フロカン東京
→ Vue Fes 🔥 → JSConf JP
Atomics API 使ったことある⼈ 🙋
使ってみる Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 1_000); → https://stackblitz.com/edit/atomics-wait-sleep $
node --eval "Atomics.wait(...)" $ bun --eval "Atomics.wait(...)" $ deno eval "Atomics.wait(...)"
JavaScriptはシングルスレッドである JavaScript はプロトタイプベースで、マルチパラダイムで、シングルスレッドで、動的な言語 https://developer.mozilla.org/ja/docs/Web/JavaScript 計算、ユーザーのイベント、画面の描画が単一のスレッドで実行される。 簡潔さの一方で、重いタスクを実行すると画面がガタつく。 → Worker (Web Workers
/ Worker threads) でマルチスレッドに対応
Workers間の通信は? .postMessage() / .addEventListener('message') が使える。 基本的には、値はコピーされる。 addEventListener で値を受け取るので非同期での通信になる。 → 高速性のためのマルチスレッドで非同期通信&値コピーでよいのか?
メモリ空間を共有する マルチスレッドプログラミングでは、スレッド間の通信方法として2つに分られる。 • 共有メモリ • メッセージパッシング postMessage はメッセージパッシングに相当。 共有メモリを利用することで、 同期的かつコピーを伴わないスレッド間通信を実現する。
Agents(≒Workers)間で共有されたメモリ空間を操作するArrayBuffer ArrayBufferなので、DataView経由で読み書きする。 const sab = new SharedArrayBuffer(1024 /* bytes */);
const i32arr = new Int32Array(sab); // DataView i32arr[0] = 0xFF; SharedArrayBuffer
バイナリしか扱えない問題 ArrayBufferなので、数字しか格納できない。 ?「Workers間でデータをやり取りするのに文字列も送れないなんて😫」 → 自分で数値に変換してください。数値に変換しづらいものに使うべきではない。 最悪JSON.stringify + TextEncoderとか、 new TextEncoder().encode(JSON.stringify(obj))
typed-cstructというOSSもよいかも
競合‧同期問題 「特定のメモリを読んで、数値を足して、書き込む」ことを考える 2つのワーカーが +1 ずつすると合計は +2 になってほしい。 が、ならないこともある。 これを、Data race(データ競合)
という。 また、タスクが完了したことを 知るすべもない。
Atomics API 競合を回避するAtomicな操作、「不可分操作」を行うためのAPI Atomics.add() を使用して加算すれば、競合を回避しつつ加算・書き込みが可能。 Atomics.wait() / Atomics.notify() を使用すれば書き込みを通知できる。
Web WorkersはWeb API 2010年HTML5仕様 → HTML Living Standard 一方、SharedArrayBufferとAtomicsはECMAScript仕様に含まれる tc39/proposal-ecmascript-sharedmem
→ ES2017 Web Workersはブラウザでしか使用できない。 Node.js、Deno、Bunはそれぞれ独自のWorkers実装を持つ。 SharedArrayBufferとAtomicsはJavaScriptエンジンに実装されている。 仕様
SharedArrayBuffer is not defined おもむろに新しいタブでJavaScriptコンソールを開いて > new SharedArrayBuffer(4) してもエラーになる。 エンジンに実装されているなら、どこでも使えるんじゃ...?
2018年に発表されたSpectreという脆弱性により、 SharedArrayBufferは一時的に無効化された。 悪用することでプロセス外のメモリが読める。 現在は条件付きで利用できる。 条件を満たしていない環境では、SharedArrayBufferは利用できない。 条件は以下の2点: • 保護されたコンテキスト内である (window.isSecureContext) •
オリジン同士が分離されている (window.crossOriginIsolated) 無効化されたSharedArrayBuffer
SharedArrayBuffer / Atomics だれが使っている? Workersが必要なケースは少なくないが、SharedArrayBuffer, Atomicsは? → WebAssemblyをビルドするEmscriptenがマルチスレッド対応に利用 具体的には ffmpeg.wasmなど。
ただし、WASM側のAtomics操作を使うため、JSのAtomicsは使われていない。 Atomicsは本当に使われている?
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 1_000); Atomics.waitはSABの値が変化するのを待機する。引数は以下: 1. typedArray: Int32Array
| Int64Array 2. index: number 3. value: number 4. timeout?: number → Int32Arrayのindex:0の値が0じゃなくなるまで最大1,000ミリ秒待機 Atomics.waitはブロッキング操作なのでメインスレッドでは使えない。 最初のサンプルの解説
⾼度な使⽤例: PartyTown Third-partyスクリプトの実行をWeb Workerに逃がしパフォーマンス向上を図る 1. Web Worker上で実行されるDOM操作等をProxyで補足 2. 補足した操作をMain threadに送信→Atomics.waitで完了を待つ
3. Main threadでDOM操作を実行、Atomics.notifyで完了通知 4. SharedArrayBuffer経由で返り値返却 制約はありつつも意欲的な解決策。 SharedArrayBufferが使用できない環境ではXHR+ServiceWorkerを利用。
おわり Atomics APIは SharedArrayBuffer とともに JavaScriptによる高速で安全な並列処理をもたらした。 JavaScriptのAtomicsはあまり使われていない(?) WebAssemblyからSharedArrayBufferを利用するケースが多いし、 使われていても、同期的な待機状態を作る目的だったりする。 あなたはAtomics
API どう使いますか?