知識マップ: マルチスレッドの実務ベストプラクティス Java編 ── 仮想スレッド時代の定石

記事「マルチスレッドの実務ベストプラクティス Java編 ── 仮想スレッド時代の定石」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

Javaでは共有データの見え方がメモリモデルのhappens-before関係で定義されており、同期なしの共有変数は未定義動作にはならないものの、古い値が見え続けたり書き込みの順序が入れ替わって見えたりするメモリ一貫性エラーが正当に起こります。実務指針は、素の共有変数で工夫せずjava.util.concurrentの道具にhappens-beforeを作らせることです。スレッドはExecutorServiceに任せ、I/O待ちが主体のタスクはJDK 21で正式化された仮想スレッドへ、CPUバウンドはコア数程度のプラットフォームスレッドへ振り分けます。仮想スレッドはプールせず、同時実行数の制限はSemaphoreで表現します。JDK 21〜23のsynchronizedによるピン留めはJDK 24のJEP 491で解消されました。停止は割り込みによる協調停止が唯一の正解で、Thread.stopは現在UnsupportedOperationExceptionになります。

Javaのマルチスレッド設計ベストプラクティスの知識マップJavaメモリモデルのhappens-beforeとメモリ一貫性エラー、ExecutorServiceと仮想スレッドの使い分け、JDK 24で解消されたピン留め、並行コレクションとBlockingQueueによる共有の削減、割り込みによる協調停止と2段階シャットダウン、SwingのEDTを示す図原因になり得る原因になり得る利用する防止する用いるのは非推奨防止するの後継前提とする推奨される対応用いるのは非推奨推奨される対応原因になり得る両立しない前提とするの後継防止する軽減する防止する実装を担う実装を担うの後継利用する推奨される対応実装を担うで確認できる用いるのは非推奨利用するの後継共有可変状態Javaメモリモデルとhappens-before競合状態(race condition)メモリ一貫性エラーhappens-before関係volatileAtomic系クラス(AtomicInteger / LongAdder)ExecutorServiceスレッドの自作(new Thread)backpressure仮想スレッドI/OバウンドなタスクCPUバウンドなタスクSemaphoreによる同時実行数制限同時実行数の制限キャリアスレッドへのピン留めsynchronizedブロック専用ロックオブジェクトReentrantLockロック取得順序の統一デッドロック(deadlock)スレッドローカル状態ConcurrentHashMap.computeIfAbsentBlockingQueue割り込み(interruption)協調キャンセルThread.stop / suspend / resumeExecutorServiceの2段階シャットダウン期限内の停止処理イベントディスパッチスレッド(EDT)UIスレッドのコンテキストスレッドダンプ(jstack / jcmd)構造化並行性(StructuredTaskScope)Scoped Values

概念間の関係(全28件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

共有可変状態
複数のスレッドから読み書きされる、書き換え可能なデータ。競合はこれと複数スレッドが揃ったときにだけ起きる。
Javaメモリモデルとhappens-before
共有データの見え方を定める規則。あるステートメントによるメモリ書き込みが、別のステートメントから見えることを保証する関係をhappens-beforeという。
happens-before関係
あるスレッドのメモリ書き込みが別スレッドの読み取りから見えることを保証する、Java言語仕様が定める順序関係。synchronized・volatile・java.util.concurrentの各機能が確立する。
volatile
最適化による読み書きの除去を抑える型修飾子。スレッド間の同期を保証するものではない。
Atomic系クラス(AtomicInteger / LongAdder)
単一変数の原子的更新を提供するJavaのクラス群。LongAdderは内部でセルを分割して競合を散らす。
ExecutorService
仕事(Runnable / Callable)と、それをどう実行するかを分離し、スレッドの生成・再利用・破棄をライブラリに任せるJavaの実行基盤。
仮想スレッド
Javaランタイムが実装する軽量スレッド。JDKのブロッキング操作の間はOSスレッドを手放すため、数百万本を1つのJVMで走らせられる。JDK 21で正式機能になった。
Semaphoreによる同時実行数制限
「外部APIへ同時10接続まで」のような制限を、プールのサイズではなくセマフォの許可数で表現する形。
synchronizedブロック
Javaの組み込みモニターによる相互排他構文。ロック対象のオブジェクトを指定して排他区間を作る。
ReentrantLock
タイムアウト付き取得(tryLock)、公平性ポリシー、複数のConditionを扱えるJavaの明示的ロック。
ロック取得順序の統一
複数のロックを取るとき、全スレッドが同じ順序で取ると決めるルール。
スレッドローカル状態
各スレッドが自分だけの領域に持つ中間状態。並列ループで共有メモリへ書き込まずに集計するために使う。
ConcurrentHashMap.computeIfAbsent
キーが不在ならマッピング関数を呼んで値を登録する、呼び出し全体が原子的に実行されるメソッド。
BlockingQueue
容量を指定できるJavaのブロッキングキュー。満杯時のputがブロックすることで背圧になる。
割り込み(interruption)
対象スレッドの割り込みステータスを立て、sleep・wait・joinでブロック中ならInterruptedExceptionで起こす、Javaの停止・キャンセルの共通言語。
ExecutorServiceの2段階シャットダウン
shutdown()で新規受付を止めて完走を待ち、期限を過ぎたらshutdownNow()で停止を試みる停止手順。
イベントディスパッチスレッド(EDT)
Swingのイベント処理コードが走る専有スレッド。ほとんどのSwingオブジェクトのメソッドはスレッドセーフではない。
デッドロック(deadlock)
複数のタスクが互いの完了やリソース解放を待ち続け、永遠に進行しなくなる状態である。
スレッドダンプ(jstack / jcmd)
指定したJavaプロセスの全スレッドのスタックトレースを出力する標準ツール。-lでロックに関する追加情報も出せる。
構造化並行性(StructuredTaskScope)
関連するサブタスク群を1つの作業単位として扱い、エラー伝播とキャンセルを構造化するJavaのAPI。
Scoped Values
スレッド内およびスレッド間で不変のコンテキストデータを安全かつ効率的に共有する仕組み。ThreadLocalの可変性・寿命管理・継承コストへの解決策としてJDK 25で正式化された。

機械可読データ

このデータセットについて

作成
合同会社小村ソフト
ライセンス
CC BY 4.0 ── 出典(合同会社小村ソフト)とライセンスへのリンクを明示し、改変した場合はその旨を示すことを条件に、再配布・改変を含めて再利用できます
最終確認日
2026-08-22 ── 収録する関係のうち、最後に出典と照合した日

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。