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
Virtual Threads - 導入の背景と、効果的な使い方 -
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Yuichi.Sakuraba
June 04, 2023
Technology
5.4k
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Virtual Threads - 導入の背景と、効果的な使い方 -
2023.06.04 JJUG CCC セッション資料
Yuichi.Sakuraba
June 04, 2023
More Decks by Yuichi.Sakuraba
See All by Yuichi.Sakuraba
Inside Stream API
skrb
1
1k
Java 25に至る道
skrb
3
330
Lazy Constant - finalフィールドの遅延初期化
skrb
0
5.3k
Language Update: Java
skrb
2
540
Java 30周年記念! Javaの30年をふりかえる
skrb
4
4.1k
JavaにおけるNull非許容性
skrb
2
4k
あなたはJVMの気持ちを理解できるか?
skrb
6
36k
で、ValhallaのValue Classってどうなったの?
skrb
2
16k
Javaにおける関数型プログラミンへの取り組み
skrb
7
760
Other Decks in Technology
See All in Technology
AIエージェントの自己改善をどう設計するか / How to Design Self-Improvement for AI Agents
22mi
25
17k
人間はどの意思決定を手放せるのか
kawasima
15
7.9k
アクセスキーこわい やめかたと漏らさない工夫
sassssan68
1
610
C#未経験の僕がAIに読めるコードを書かせるまで
maguroalternative
0
230
作って終わりじゃないサーバーレス 〜9年運用する大規模EC物流API基盤の設計・運用のリアル〜
zozotech
PRO
0
440
The Knowledge Spine: A Machine-Executable Ontology for Governed Marketing Activation
vananth22
0
120
Cloudflare Workers 向けアプリを C# で構築する ~WASM Native AOT への道~
nenonaninu
1
970
AI時代の「技術的負債」の変質ー概念の終焉と再解釈、エージェントと共に向かう先
nwiizo
1
3.2k
白金鉱業Meetup Vol.25 アウトカムが二値のデータに対するCausal Impact
brainpadpr
0
280
AI 時代のスタートアップエコシステ厶から考究する技術的負債との向き合い方
m3m0r7
PRO
3
2.6k
なぜ「決定性」が 決定的に重要なのか? Durable Execution 基盤の数理的理解 #serverlessjp / ServerlessDays Tokyo 2026
ytaka23
3
1.2k
「ピッケル本」日本語版は4.0(第6版)が出版されるべき / pickaxe4-nagoyark05
kakutani
2
270
Featured
See All Featured
Designing Powerful Visuals for Engaging Learning
tmiket
1
570
What does AI have to do with Human Rights?
axbom
PRO
1
2.4k
Building Flexible Design Systems
yeseniaperezcruz
330
41k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
570
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
670
Joys of Absence: A Defence of Solitary Play
codingconduct
1
530
From π to Pie charts
rasagy
1
380
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
ラッコキーワード サービス紹介資料
rakko
1
5M
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
430
The Invisible Side of Design
smashingmag
301
52k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
Transcript
Virtual Threads -導入の背景と効果的な使い方 - 櫻庭 祐一 Java in the Box
3 分でわかる Virtual Threads JVM が管理する軽量スレッド Fiber 他言語でいうところの スループット向上が目的 I/Oを多く含むシステムで効果的
応答時間はちょっとだけ悪化 従来のスレッドと使い方は同じ 使用上の注意点はある
導入の背景 Agenda 歴史的経緯とともに 動作原理 なぜスループットが向上するのか 効果的な使い方 ユースケースをもとに
導入の背景 歴史的経緯とともに
2004 2011 2014 2023 1995 Java 5 Java 7 Java
8 Java 21 Java 1.0
2004 2011 2014 2023 1995 Java 5 Java 7 Java
8 Java 21 Java 1.0 Single Core の時代 Thread = OSスレッドのラッパー Threadの切替 : スレッドのコンテキストスイッチ OS Threadオブジェクト生成: 重い & メモリ消費大
OS Thread Java Thread JVM Stack new Thread(new Runnable() {
public void run() { foo(); } }).start(); run() Frame void foo() { bar(); } foo() void bar() { ... } bar()
OS Thread Java Thread JVM Stack new Thread(new Runnable() {
public void run() { foo(); } }).start(); run() Frame void foo() { bar(); } foo() void bar() { ... } bar() run() foo() bar() Operand Stack Local Var.
OS Thread Java Thread JVM Stack run() foo() bar() Operand
Stack Local Var. のコンテキストスイッチ Thread のスレッドの状態 OS オブジェクトの状態 Thread JVM Stack + + の退避・復帰
2004 2011 2014 2023 1995 Java 5 Java 7 Java
8 Java 21 Java 1.0 Single Core の時代 Thread = OSスレッドのラッパー Threadの切替 : スレッドのコンテキストスイッチ OS Threadオブジェクト生成: 重い & メモリ消費大 重い & メモリ消費大 コンテキストスイッチをなるべく発生させない スレッドスケジューリング
2011 2014 2023 Java 7 Java 8 Java 21 Java
1.0 1995 2004 Java 5 Multi Core 黎明期 Concurrency Utilities スレッドとタスクの分離 スレッドプール導入 Executors.newFixedThreadPool 応答時間重視 Executors.newCachedThreadPool スループット重視 リクエスト増大 スループット頭打ち Thread per Request/Task
2011 2014 2023 Java 7 Java 8 Java 21 Java
1.0 1995 2004 Java 5 Multi Core 黎明期 public class ThreadPoolExecutor extends AbstractExecutorService { ... private final class Worker extends AbstractQueuedSynchronizer implements Runnable { Worker(Runnable firstTask) { setState(-1); // inhibit interrupts until runWorker this.firstTask = firstTask; this.thread = getThreadFactory().newThread(this); } ... Apache Tomcat 例
2014 2023 Java 8 Java 21 Java 1.0 1995 2004
Java 5 2011 Java 7 Big Dataの時代 Fork/Join Framework 分割統治法 タスクを細粒度に分割して処理 Work-Stealing タスクスケジューラー スレッドごとにタスクキュー キューが空の時は他のスレッドからタスクを盗む 効率的なタスクスケジューリング
業務タスクの特徴 Comp. I/O C I/O I/O C C 通信、 DBアクセスなど
I/O処理が多い I/O処理は計算処理に対して多大な時間を要する I/Oの待ち時間が長い その中でも I/O待ちの間 CPUが遊んでしまう I/O待ちの間に他の処理を行いたい
2023 Java 21 Java 1.0 1995 2004 Java 5 2011
Java 7 2014 Java 8 Project Lambda ラムダ式の導入 処理を関数として記述 CompletableFuture Reactive Programming 非同期処理を関数で記述 CompletableFuture Reactive Programming ex. Spring WebFlux Oracle Helidon SE 処理を非同期実行することで スループット向上 I/O とはいうものの 従来の逐次的な記述と考え方が異なる ... 例外処理が ... デバッグが ...
Java 1.0 1995 2004 Java 5 2011 Java 7 2014
Java 8 2023 Java 21 従来の逐次的な記述で 例外処理をあつかいやすく デバッグもやりやすいままで スループットを向上させたい Virtual Threads
動作原理 なぜスループットが向上するのか
Virtual Threads Platform Threadとタスクの仲介 Platform Thread タスクからは と区別がつかない Platform Thread
にマウントして実行 Carrier Thread マウントしたスレッドを と呼ぶ 積極的なコンテキストスイッチ 限定継続を導入してコンテキストスイッチの高速化 Work-Stealingによるスレッドスケジューリング 一貫性のあるスタックトレース Carrier Threadが変わってもスタックトレースが切れない
Platform Thread Platform Thread ...... Virtual Thread Task Instantiation
Platform Thread Platform Thread ...... Virtual Thread Task Mount
Platform Thread Platform Thread ...... Virtual Thread Task I/O Wait
Platform Thread Platform Thread ...... Virtual Thread Task Unmount
Platform Thread Platform Thread ...... Virtual Thread Task I/O Interrupt
Platform Thread Platform Thread ...... Virtual Thread Task Mount
Platform Thread Platform Thread ...... Virtual Thread Task I/O待ち時間の活用による大幅なスループット向上 頻繁なコンテキストスイッチによる応答時間の悪化
Platform Thread Platform Thread ...... Virtual Thread Task public int
read(ByteBuffer buf) throws IOException { ... readLock.lock(); try { ... configureSocketNonBlockingIfVirtualThread(); n = IOUtil.read(fd, buf, -1, nd); if (blocking) { while (IOStatus.okayToRetry(n) && isOpen()) { park(Net.POLLIN); n = IOUtil.read(fd, buf, -1, nd); } } ... sun.nio.ch.SocketChannelImpl 例
void park() { ... boolean yielded = false; setState(PARKING); try
{ yielded = yieldContinuation(); } finally { ... } ... } java.lang.VirtualThread private boolean yieldContinuation() { ... unmount(); try { return Continuation.yield(VTHREAD_SCOPE); } finally { mount(); ... } } 限定継続
効果的な使い方 ユースケースをもとに
Virtual Threadsの使い方 ExecutorServiceを介して利用する Executors.newVirtualThreadPerTaskExecutor() Executors.newThreadPerTaskExecutor( Thread.ofVirtual().factory()) or Virtual Threadの直接生成も可能だが、基本はやらない ExecutorServiceを定義する場合だけ
独自の ExecutorServiceはJava 19からAutoClosable
Virtual Threadsの使い方 try (var pool = Executors.newVirtualThreadPerTaskExecutor()) { Runnable task
= ...; pool.submit(task); }
VT 使いたい Y FWを使ってる ? VT使う必要なし WebFluxなどのリアクティブ系 or CompletableFutureゴリゴリ書ける Spring
Boot, Jakarta EE など FWの対応待ち その他 使ってない or
VT使う必要なし or CompletableFutureゴリゴリ書ける Spring Boot, Jakarta EE など FWの対応待ち その他
使ってない or ボトルネックは? データ量 / 計算量 ParallelStream Fork/Join FW Vector API File Memory Map DB 通信 / VirtualThread
スレッドの注意点 Virtual Threads 特に synchronizedをなるべく使わないようにする 1. synchronized = モニタロック リソースへのアクセスを
1 つのスレッドだけに限定 他のスレッドをブロックする ボトルネックになりやすい Virtual Threadでは Carrier Threadをブロックしてしまう
スレッドの注意点 Virtual Threads 特に synchronized を使わないようにするには イミュータブルクラスの活用 record 型の利用 状態が変化しなければ複数スレッドからもアクセス可
処理結果の受け渡しがある場合 Callableを使う どうしてもロックが必要であれば synchronizedではなくReentrantLock クラスを使う java.util.concurrent.locksにロッククラスあり 他にも
スレッドの注意点 Virtual Threads 特に ThreadLocal を使わない 2. ThreadLocal はミュータブル &
ライフタイムが不明確 Virtual Threads ThreadLocalをサポートしているが は スケールしないためボトルネック化 ScopedValueで代用する Java 21 Preview JEP では ただし FWが ThreadLocal を使っている場合 対応してくれるまで待ちましょう
スレッドの注意点 Virtual Threads 特に スレッドを使いまわさない 3. Virtual Threadsは使い捨て ExecutorService スレッドのプールは
にまかせる タスクを記述することに集中しよう クラスの 4. Thread APIをもう 1 度チェック @Deprecated(forRemoval=true)なメソッド stop, suspend, resumeなど
Conclusion Virtual Threadsによりスループットが向上 I/Oの待ち時間を有効活用 Virtual Threadsは従来のスレッドを同じ使い方 使用時の注意点を把握する FWで Virtual Threads
がサポートされるのを楽しみに待つ
Virtual Threads -導入の背景と効果的な使い方 - 櫻庭 祐一 Java in the Box