Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
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.3k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Atomics APIを知る / Understanding Atomics API
TOMIKAWA Sotaro
November 15, 2025
More Decks by TOMIKAWA Sotaro
See All by TOMIKAWA Sotaro
ReactとSvelteのその先、Ripple-TS / Beyond React and Svelte: Ripple-TS
ssssota
3
2.3k
なんでRustの環境構築してないのにRust製のツールが動くの? / Why Do Rust-Based Tools Run Without a Rust Environment?
ssssota
15
55k
Web技術を最大限活用してRAW画像を現像する / Developing RAW Images on the Web
ssssota
2
3.2k
漸進。
ssssota
0
3.6k
Preact、HooksとSignalsの両立 / Preact: Harmonizing Hooks and Signals
ssssota
1
3.7k
useSyncExternalStoreを使いまくる
ssssota
6
6.9k
React CompilerとFine Grained Reactivityと宣言的UIのこれから / The next chapter of declarative UI
ssssota
8
6.2k
新しいAPI createRawSnippet触ってみた / What is the createRawSnippet?
ssssota
2
330
脱法Svelte / Evasion of svelte rules
ssssota
1
340
Other Decks in Programming
See All in Programming
トークンをケチるな、設計しろ:GitHub Copilotを賢く使うコンテキスト戦略
ochtum
0
220
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
3.3k
IBM Bobを活用したレガシーアプリの最新化
oniak3ibm
PRO
1
220
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
1
310
ふつうのFeature Flag実践入門
irof
8
4.2k
エンジニアと一緒にテストコードの設計と実装を改善した話
mototakatsu
0
230
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
810
正しくソフトウェアを作る、前提を疑うための認知の視点 / doubt-premise
minodriven
21
7.1k
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
300
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
x5gtrn
PRO
0
1.3k
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
600
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
12
4.5k
Featured
See All Featured
Why Our Code Smells
bkeepers
PRO
340
58k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.1k
Believing is Seeing
oripsolob
1
160
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.3k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
610
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
870
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.5k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Are puppies a ranking factor?
jonoalderson
1
3.7k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
250
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
62
55k
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 どう使いますか?