スレッドと並行処理の基礎を“やさしく深く”理解する:なぜプログラムは順番どおり動かないのか?【Java内部構造 × 図解】

🧠【初心者向け】スレッドと並行処理をやさしく解説(図解あり)

プログラムを学び始めた人が必ず驚く現象があります。

「コードは上から順番に実行されるはずなのに、そう動かない…?」

その理由こそが スレッド(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 の一言(後書き)

スレッド・並行処理の本質が分かると
パフォーマンス最適化・非同期処理・リアクティブ構造
など高度な分野に進む土台になります。

特にマルチスレッドは
“問題が起きた時に原因が特定しにくい領域”
なので、理解しているだけで大きな武器になります。

コメント

タイトルとURLをコピーしました