🧠【初心者向け】スレッドと並行処理をやさしく解説(図解あり)
プログラムを学び始めた人が必ず驚く現象があります。
「コードは上から順番に実行されるはずなのに、そう動かない…?」
その理由こそが スレッド(Thread) と
並行処理(Concurrency) の世界です。
- スレッドって何?
- 並行(Concurrency)と並列(Parallelism)は違う?
- マルチスレッドはなぜ難しい?
- 共有資源が衝突するってどういうこと?
- synchronized の意味は?
- ExecutorService って何?
- CPU コアとスレッドの関係は?
この記事では
初心者がつまずくポイント → 図解 → 内部構造 → 実務の勘所
の順で、スレッドの本質を分かりやすく解説します。
✨ 結論
✔ スレッドは「同時に動く複数の流れ」
✔ 並行(Concurreny)=順番が入れ替わる可能性のある実行
✔ 並列(Parallelism)=物理的に同時実行
✔ マルチスレッドは“共有資源”による問題が本質的に難しい
✔ Java の実務では ExecutorService による管理が基本
✔ スレッドの動作順を「予測できないもの」と理解する
スレッドとは何か?(本質から)
スレッドを一言で言うと:
プログラムの中で“同時に動く処理の流れ”
CPUは高速でタスクを切り替えながら実行しています。
🔹 図解(短線版)
Task A : ■■■□□■■■□□■■■
Task B : □□■■□■■□□■■□□
Task C : ■□■■□■■□□■■■□
(実際は切り替わって見える)
これをスレッドの実行と呼びます。
並行(Concurrency)と並列(Parallelism)の違い
初心者が100%混乱する概念。
✔ 並行(Concurrency)
論理的に同時
実際には高速で切り替えているだけ。
例:1人の店員がレジを行ったり戻ったりする。
✔ 並列(Parallelism)
物理的に同時
CPUコアが複数ある場合の本当の同時実行。
例:店員が2人いて同時にレジを打つ。
🔹 図解
並行: ABABABAB
並列: AAAAA + BBBBB(同時)
なぜスレッドは「順番どおり動かない」のか?
答えはシンプル。
スケジューラ(OS)が実行タイミングを決めているから
コードの順番と実行順は一致しません。
🔹 図解
A.start();
B.start();
予想:A → A → A → B → B → B
実際:A → B → A → B → B → A(毎回違う)
これは 正常な動き です。
スレッドの基本(Java 編)
Java では以下の方法でスレッドを扱います👇
✔ Thread クラスを継承
✔ Runnable を実装
✔ ExecutorService を使う(実務の標準)
Runnable の例(基本形)
Runnable task = () -> {
System.out.println("Hello from thread!");
};
new Thread(task).start();
実務では ExecutorService が“絶対必須”
Thread を直接使うのは非推奨。
実務では ExecutorService を使います。
ExecutorService executor = Executors.newFixedThreadPool(4);
executor.submit(() -> doWork());
executor.shutdown();
マルチスレッドが難しい本当の理由(本質)
理由は 共有資源の競合(Race Condition) が起こるから。
🔹 図解
counter++
Thread A: counter を読む → 10
Thread B: counter を読む → 10
Thread A: counter を書く → 11
Thread B: counter を書く → 11(値がおかしくなる)
synchronized の意味(直感で理解する)
synchronized は
「この部分は1人ずつしか通れません」
という鍵(ロック)の仕組み。
synchronized {
counter++;
}
デッドロック(Deadlock)の例(上級)
2つの鍵を取り合うと永遠に止まる。
🔹 図解
A が鍵1を持つ → 鍵2待ち
B が鍵2を持つ → 鍵1待ち
→ 永遠に終了しない
スレッド数と CPU コアの関係(内部構造)
スレッドはCPUコア以上に作ってもOKですが
増やしすぎると逆に遅くなります。
理由👇
- 文脈切り替えの負荷
- キャッシュミス
- ロック競合
一般に
CPUコア数 × 2 + 1
がスレッドプールの目安です。
ここまでのまとめ(初心者向け)
- スレッドは“同時に動く処理の流れ”
- 並行と並列は別物
- スレッドの実行順は予測できない
- 競合状態(Race Condition)が一番危険
- synchronized は「鍵」の仕組み
- 実務は ExecutorService が必須
Deep Friendly Tech の一言(後書き)
スレッド・並行処理の本質が分かると
パフォーマンス最適化・非同期処理・リアクティブ構造
など高度な分野に進む土台になります。
特にマルチスレッドは
“問題が起きた時に原因が特定しにくい領域”
なので、理解しているだけで大きな武器になります。

コメント