🧠【初心者向け】CPU とマルチスレッドの本質をやさしく解説(図解あり)
マルチスレッドは
「スレッド数を増やせば速くなる」と勘違いされがちですが、
実際には CPU の仕組み を理解していないと逆に遅くなります。
- CPUコアって何?
- スレッドはいくつまで増やせる?
- なぜスレッドを増やすと遅くなる?
- 文脈切り替え(コンテキストスイッチ)とは?
- キャッシュミスって何?
- CPUバウンドとI/Oバウンドの違いは?
- Javaのスレッドプールはコア数とどう関係する?
これらを 図解 × 比喩 × 内部構造 の組み合わせで
“直感的に” 理解できるように解説します。
✨ 結論
✔ スレッド数より「CPUコア数」が高速化の決定要素
✔ コアを超えてスレッドを増やすと“文脈切り替え”が増えて逆に遅い
✔ CPUバウンドとI/Oバウンドで適切なスレッド数は全く異なる
✔ Java実務では「CPUコア × 2 + 1」が原則
✔ parallelStream や ExecutorService は CPU特性を理解して使う
CPUコアとは何か?(本質から)
CPUには「コア」と呼ばれる実行単位があります。
🔹 図解(短線版)
CPU
├─ Core 0
├─ Core 1
├─ Core 2
└─ Core 3
4コアCPUなら“物理的に4つ同時実行”できます。
スレッドは「作れるけど、同時には動かない」
スレッドは何百でも作れますが
実際に同時実行できるのは CPUコア数だけ です。
🔹 図解(4コアの場合)
同時実行できるスレッド数 = 4
他のスレッドは待機 or 切り替えで対応します。
スレッドが増えると遅くなる理由(重要)
理由は コンテキストスイッチ(文脈切り替え) にあります。
🔹 図解
Thread A を実行 → 保存
Thread B を実行 → 保存
Thread C を実行 → 保存
切り替えるたびに
- レジスタ保存
- キャッシュ破棄
- 状態復元
が必要で、CPUに負荷がかかる。
CPUキャッシュとは何か?(内部構造)
CPUは
- L1
- L2
- L3
というキャッシュ階層を持ち、
“直前のデータ” を超高速で保持しています。
スレッド切り替えが多いと
キャッシュミス が増えて性能が落ちます。
CPUバウンドと I/Oバウンドの違い
これはスレッド数を決めるうえで最重要。
✔ CPUバウンド
計算処理が重い
→ スレッドを増やしても効果が薄い
✔ I/Oバウンド
ネットワーク/ファイル待ちが多い
→ スレッドを増やすと効果が高い
Java 実務で最適なスレッド数(答え)
✔ 基本は
CPUコア数 × 2 + 1
例:8コアCPU
→ 17スレッドが上限目安
parallelStream の罠(実務で超重要)
parallelStream は環境依存で
CPU を使い切ってしまうことがあります。
✔ CPUバウンド処理では遅くなる
✔ サーバーアプリでは絶対に使い所を考えるべき
ここまでのまとめ(初心者向け)
- 同時実行できるのは“CPUコア数”
- スレッドは増やせるが、増やすと遅くなることも多い
- 文脈切り替えとキャッシュミスが性能低下の原因
- CPUバウンドとI/Oバウンドを分けて考える
- Java実務では「CPUコア×2+1」
Deep Friendly Tech の一言(後書き)
CPUの動きを理解すると、
“アプリがどこで遅くなるのか” が読めるようになります。
エンジニアとしての
パフォーマンス最適化の基礎体力 が大幅に向上する領域です。

コメント