Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Atomics APIを知る / Understanding Atomics API
Search
TOMIKAWA Sotaro
November 15, 2025
Programming
1.4k
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
フロントエンドUIフレームワークのこれまでとこれから
ssssota
5
2.9k
ReactとSvelteのその先、Ripple-TS / Beyond React and Svelte: Ripple-TS
ssssota
3
2.7k
なんでRustの環境構築してないのにRust製のツールが動くの? / Why Do Rust-Based Tools Run Without a Rust Environment?
ssssota
15
56k
Web技術を最大限活用してRAW画像を現像する / Developing RAW Images on the Web
ssssota
2
3.4k
漸進。
ssssota
0
3.7k
Preact、HooksとSignalsの両立 / Preact: Harmonizing Hooks and Signals
ssssota
1
3.9k
useSyncExternalStoreを使いまくる
ssssota
6
7.1k
React CompilerとFine Grained Reactivityと宣言的UIのこれから / The next chapter of declarative UI
ssssota
8
6.3k
新しいAPI createRawSnippet触ってみた / What is the createRawSnippet?
ssssota
2
350
Other Decks in Programming
See All in Programming
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
2.4k
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
560
難しいけど、読めた。- OSSの入口に立った話。
sts11142
0
120
更なる可用性を求めて、5年間運用したKotlinのアプリケーションをGoでリプレイスする話
ken_tunc
0
370
Workers Cache を知る
syumai
0
270
AWSに止められる覚悟してますか?
morizo_1984
1
370
モバイル交通系ICへのチャージ実例から考える、クロスプラットフォーム開発におけるiOS実機テスト設計とCI運用
yusuga
1
540
[GoCon2026] When Goroutines Are Not Enough: Runtime Locality in High-Throughput Go
takehaya
6
2.5k
新卒PdEのリアル
ryu1013
1
520
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
580
Vue Fes Japan 2026 タイムテーブル徹底解説
448jp
1
520
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
220
Featured
See All Featured
Building Adaptive Systems
keathley
44
3.2k
The untapped power of vector embeddings
frankvandijk
2
1.9k
Optimizing for Happiness
mojombo
378
71k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
670
Between Models and Reality
mayunak
4
470
Visualization
eitanlees
153
17k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
920
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
Why Our Code Smells
bkeepers
PRO
340
58k
New Earth Scene 8
popppiees
4
2.6k
Navigating Team Friction
lara
192
16k
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 どう使いますか?