Java マルチスレッドに関するインタビューのトップ 40 の質問と回答 – 2026 年版

Java マルチスレッドの面接の準備には、同時実行の概念についての深い理解と実践的な経験が必要です。以下に、基本的な定義から仮想スレッドや構造化された同時実行性などの高度なトピックまで、すべてを網羅する 40 の慎重に作成された質問と専門家の回答を示します。
👉 無料 PDF ダウンロード:Java マルチスレッド インタビューの質問と回答
1) Java のマルチスレッドとは何ですか?また、それが使用される理由は何ですか?
マルチスレッドにより、Java アプリケーションは複数のスレッドを同時に実行できるようになり、CPU 使用率が最大化され、応答性が向上します。これは、I/O バウンドのタスク、大規模な計算、および 1 つのスレッドがブロックしている間に別のスレッドが処理を継続する GUI 更新の場合に特に役立ちます。
メリット
- CPU 使用率が高い
- 独立した操作によるレイテンシの削減
- UI の応答性の向上
例 :Web サーバーは、各リクエストを別個のスレッドに割り当てることで、数十のクライアント リクエストを同時に処理できるため、I/O 操作のブロックを回避できます。
2) Java のスレッドのライフサイクルについて説明します。
Java スレッドは、次の状態を経て進行します。
| 状態 | 説明 |
| 新規 | スレッドは作成されましたが、まだ開始されていません。 |
| 実行可能 | スレッドは実行準備ができているか、現在実行中です。 |
| ブロックされました | スレッドはモニターのロックを待機します。 |
| 待機中 | スレッドは別のスレッドのシグナルを無限に待ちます。 |
| 時間指定待機 | スレッドは指定された期間待機します。 |
| 終了 | スレッドの実行が終了しました。 |
テーブル>
t.start() の場合 が呼び出されると、スレッドは新規から移動します。 実行可能に .
3) プロセスとスレッドの違いは何ですか?
| 基準 | プロセス | スレッド |
| メモリ | 独自のアドレス空間 | プロセス メモリを共有します |
| コミュニケーション | IPC が必要 | メモリを直接共有します |
| 作成コスト | 高価 | 軽量 |
| 障害による影響 | 孤立 | 兄弟に影響を与える可能性があります |
テーブル>
たとえば、ブラウザ プロセスには、レンダリング、ネットワーキング、ユーザー インタラクションのための複数のスレッドが含まれる場合があります。
4) Java では同期はどのように機能しますか?
同期により、一度に 1 つのスレッドだけが共有リソースにアクセスすることが保証され、競合状態やデータ破損が防止されます。 synchronized キーワードはメソッド全体または特定のブロックをロックします。
<オル> 同期方式 – メソッドのモニターをロックします。
同期ブロック – 選択したオブジェクトをロックします。
synchronized void increment() {
count++;
}
5) Java でスレッドを作成するさまざまな方法には何がありますか?
<オル> Thread を延長します class MyThread extends Thread {
public void run() { System.out.println("Thread running"); }
}
new MyThread().start();
Runnable の実装 class MyRunnable implements Runnable {
public void run() { System.out.println("Runnable running"); }
}
new Thread(new MyRunnable()).start();
呼び出し可能および将来 (モダン) – 値を返し、チェックされた例外をスローできます。Callable task = () -> 42;
Future result = executor.submit(task);
System.out.println(result.get());
6) start() の違いは何ですか? と run() ?
| アスペクト | start() | run() |
| スレッドの作成 | 新しい OS スレッドを作成します | 現在のスレッドで実行 |
| 呼び出し | JVM のスレッドをスケジュールする | 単純なメソッド呼び出し |
| 同時実行性 | 非同期実行 | 順次実行 |
テーブル>
t.start() を呼び出しています 新しいスレッドを立ち上げます。 t.run() 他のメソッドと同様に動作します。
7) スレッド セーフの概念とそれを実現する方法を説明します。
スレッド セーフにより、共有データへの同時アクセスが状態を破壊しないことが保証されます。これは次の方法で実現できます。
synchronized ブロックまたはメソッド
volatile 変数
- 明示的なロック (例:
ReentrantLock) 、ReadWriteLock )
- スレッドセーフなコレクション (
ConcurrentHashMap) 、CopyOnWriteArrayList )
- アトミック クラス (
AtomicInteger) 、AtomicBoolean )
AtomicInteger counter = new AtomicInteger();
counter.incrementAndGet();
8) wait() の違いは何ですか? 、sleep() 、および yield() ?
| メソッド | クラス | ロック解除 | 目的 | 期間 |
wait() | オブジェクト | はい | 通知を待ちます | 通知されるまで |
sleep() | スレッド | いいえ | 実行を一時停止 | 固定時間 |
yield() | スレッド | いいえ | スケジューラの切り替えを提案する | 予測不可能 |
テーブル>
wait() を使用してください スレッド間通信用。 sleep() を使用してください スレッドを一時停止します。
9) Executor Framework はスレッド管理をどのように改善しますか?
このフレームワークはタスクの送信をスレッドの作成から切り離し、効率的なスレッド プーリングとリソースの再利用を可能にします。これは java.util.concurrent の一部です そしてオファー:
- スレッドの再利用によるオーバーヘッドの削減
- 柔軟なプール タイプ(固定、キャッシュ、シングル、スケジュール、ワークスチール)
- 正常なシャットダウン メカニズム
ExecutorService executor = Executors.newFixedThreadPool(5);
executor.submit(() -> System.out.println("Task executed"));
executor.shutdown(); 10) Java で使用できるスレッド プールにはどのような種類がありますか?
| プールの種類 | ファクトリーメソッド | 説明 |
| 固定スレッドプール | newFixedThreadPool(n) | 固定スレッド数 |
| キャッシュされたスレッドプール | newCachedThreadPool() | 必要に応じてスレッドを作成し、アイドル状態のスレッドを再利用します |
| シングルスレッドエグゼキュータ | newSingleThreadExecutor() | 順次実行のための単一ワーカー スレッド |
| スケジュールされたスレッドプール | newScheduledThreadPool(n) | 遅延タスクまたは定期的なタスクをサポート |
| WorkStealingPool | newWorkStealingPool() | 利用可能なプロセッサを動的に利用します |
テーブル> 11) Java のデッドロックとは何ですか?また、それを防ぐにはどうすればよいですか?
デッドロックは、2 つ以上のスレッドが互いのロックを解放するのを無限に待機すると発生します。これは通常、ロックの順序が一貫していないことが原因で発生します。
synchronized (A) {
synchronized (B) { /*...*/ }
}
synchronized (B) {
synchronized (A) { /*...*/ }
}
予防戦略:
<オル> 一貫したグローバルな順序でロックを取得します。
tryLock() を使用します タイムアウトあり。
可能な限り、ネストされたロックを避けてください。
手動ロックよりも高レベルの同時実行ユーティリティを優先する
12) synchronized の違い および ReentrantLock .
| 機能 | synchronized | リエントラントロック |
| 取得 | 暗黙的 | lock() による明示的 |
| ロックを解除しています | メソッド終了時に自動的に | unlock() によるマニュアル |
| 試行/タイムアウト | 利用できません | tryLock() をサポートします そしてタイムアウト |
| 公平性 | 構成できません | 公正な注文をサポート |
| 条件変数 | サポートされていません | 複数の Condition をサポート オブジェクト |
テーブル> ReentrantLock lock = new ReentrantLock();
if (lock.tryLock(1, TimeUnit.SECONDS)) {
try { /* critical section */ } finally { lock.unlock(); }
} 13) volatile の違い と synchronized .
| アスペクト | 揮発性 | 同期済み |
| 目的 | 可視性 | 原子性 + 可視性 |
| 原子性 | 保証なし | 保証 |
| ロック | いいえ | はい |
| 使用例 | 単純なフラグ | 複合演算 |
テーブル> volatile boolean running = true;
synchronized void increment() { count++; } 14) Java の ThreadLocal について説明します。
ThreadLocal はスレッド固有のデータを提供し、共有の可変状態の必要性を排除します。各スレッドは、独自の分離されたコピーにアクセスします。
ThreadLocal counter = ThreadLocal.withInitial(() -> 0);
counter.set(counter.get() + 1);
- データの破損を防ぐ
- スレッドごとのコンテキスト(セッション ID など)に役立ちます
remove() を呼び出す必要があります メモリリークを避けるためにスレッドプールに配置する
15) Java のアトミック クラスとは何ですか?また、それらが使用される理由は何ですか?
アトミック クラス (例:AtomicInteger) 、AtomicBoolean 、AtomicReference ) CAS (Compare-And-Swap) を使用して、ロックフリーのスレッドセーフな操作を実行します。同期ブロックと比較して、単純な更新のスループットが高くなります。
AtomicInteger counter = new AtomicInteger();
counter.incrementAndGet();
16) セマフォとは何ですか? ロックとの違いは何ですか?
| アスペクト | セマフォ | ロック |
| 目的 | 同時アクセスを制限する | 相互排除 |
| 許可 | 複数 | シングル |
| ブロック中 | 許可を取得 | 所有権を取得 |
| 使用例 | 接続プーリング | クリティカルセクションの保護 |
テーブル> Semaphore sem = new Semaphore(3);
sem.acquire();
// use resource
sem.release();
17) フォーク/結合フレームワークについて説明します。
Java 7 で導入され、ワークスチール アルゴリズムを使用して再帰的に分割可能なタスクの並列実行が可能になります。アイドル状態のスレッドはビジー状態のスレッドから作業を奪い、CPU 使用率を最大化します。
class SumTask extends RecursiveTask {
protected Integer compute() {
if (end - start <= threshold) return computeDirectly();
int mid = (start + end) / 2;
SumTask left = new SumTask(start, mid);
SumTask right = new SumTask(mid, end);
left.fork();
return right.compute() + left.join();
}
}
18) CompletableFuture は非同期プログラミングをどのように改善しますか?
CompletableFuture は、ノンブロッキングで構成可能な非同期操作を可能にし、コールバック 地獄を排除し、チェーン、例外処理、並列構成をサポートします。
CompletableFuture.supplyAsync(() -> "Hello")
.thenApply(str -> str + " World")
.thenAccept(System.out::println); 19) デーモン スレッドとは何ですか?
デーモン スレッドはバックグラウンドで実行され、ガベージ コレクションやタイマー タスクなどのサービスを提供します。ユーザー スレッドがなくなると、JVM はすべてのデーモン スレッドを自動的に終了します。
Thread daemon = new Thread(() -> System.out.println("Daemon running"));
daemon.setDaemon(true);
daemon.start(); 20) Java でのマルチスレッドのベスト プラクティス。
<オル> 高レベルの同時実行ユーティリティ (ExecutorService、BlockingQueue) を優先します。
共有の変更可能な状態を避けます。不変性を好む
同期されたラッパーではなく同時コレクションを使用します。
割り込みを正しく処理し、割り込みフラグを復元します。
shutdown() を使用してエグゼキュータを正常にシャットダウンします。 または shutdownNow() .
競合を減らすために同期範囲を最小限に抑えます。
最適化前のプロファイル。 JFR や async‑profiler などのツールは、ホットスポットの特定に役立ちます。
21) Java メモリ モデル (JMM) とは何ですか?なぜ重要ですか?
JMM は、スレッドがメモリを介して対話する方法を定義し、可視性、順序付け、原子性を確保します。これにより、事前発生関係が確立されます。これは、正しい並行コードを作成するために重要です。
- 可視性:1 つのスレッドによる変更は他のスレッドからも参照できる必要があります。
- 順序:アクションは一貫性を保つために順序付けされます。
- 原子性:特定の操作は分割できません。
22) ConcurrentHashMap と synchronizedMap の違い。
| 機能 | 同時ハッシュマップ | synchronizedMap |
| ロックの粒度 | セグメントレベル (部分的) | マップ全体 |
| 競合中のパフォーマンス | 高い | 低い |
| Null キー/値 | 許可されません | 許可 |
| イテレータの一貫性 | 一貫性が低い | フェイルファスト |
| 同時読み取り | 許可 | ブロックされました |
テーブル> 23) デッドロックの検出とデバッグ。
<オル> jstack <pid> 経由のスレッド ダンプ 行き詰まりを明らかにする。
VisualVM または JConsole は、リアルタイムのスレッド監視を提供します。
ThreadMXBean.findDeadlockedThreads() によるプログラムによる検出 .
24) 並列ストリームと明示的スレッド。
並列ストリームは内部で Fork/Join フレームワークを使用し、データ処理用の高レベル API を提供します。明示的なスレッドは手動での管理が必要ですが、きめ細かい制御が可能です。
| アスペクト | 並列ストリーム | スレッド |
| 抽象化 | 高レベル API | 低レベル制御 |
| 管理 | ForkJoinPool 経由で自動 | 手動スレッド プール |
| チューニング | 共通プールを使用します | カスタム プール サイズ |
| エラー処理 | 限定 | フルコントロール |
テーブル> 25) CountDownLatch、CyclicBarrier、および Phaser。
| 機能 | カウントダウンラッチ | サイクリックバリア | フェイザー |
| リセット | いいえ | はい | はい |
| パーティー | 修正済み | 修正済み | 動的 |
| 使用例 | タスクが完了するまで待ちます | 会うべきスレッド | 動的調整 |
テーブル> CountDownLatch latch = new CountDownLatch(3);
for (...) new Thread(() -> { /* work */ latch.countDown(); }).start();
latch.await(); 26) 呼び出し可能と実行可能の違い。
| アスペクト | 実行可能 | 呼び出し可能 |
| 戻り値 | いいえ | はい |
| チェックされた例外 | いいえ | はい |
| パッケージ | java.lang | java.util.concurrent |
テーブル> Callable task = () -> 42;
Future result = executor.submit(task);
System.out.println(result.get());
27) プロデューサとコンシューマの BlockingQueue。
BlockingQueue は、プロデューサーとコンシューマーのパターンを簡素化するスレッドセーフなブロック操作を提供します。
BlockingQueue queue = new ArrayBlockingQueue<>(10);
new Thread(() -> queue.put(1)).start(); // Producer
new Thread(() -> System.out.println(queue.take())).start(); // Consumer
- 手動
wait() を削除します。 /notify() .
- 制限付きおよび制限なしの実装をサポートします。
28) スレッドの飢餓とライブロック。
飢餓は、優先度の低いスレッドが CPU 時間をまったく受け取らない場合に発生します。ライブロックは、スレッドが状態を継続的に変更しているにもかかわらず進行しない場合に発生します。軽減策には、公平なロック、ビジー待機の回避、適切なスケジュール設定が含まれます。
29) マルチスレッド アプリケーションのパフォーマンスの向上。
<オル> スレッド プールを使用します。
同期範囲を縮小します。
同時データ構造を活用する
不変オブジェクトを好む
誤った共有を避けます。
CPU コアに合わせてスレッド数を調整します。
非同期 I/O を使用してオペレーションをブロックします。
30) 現実世界のマルチスレッド シナリオ。
支払いゲートウェイでは、同時トランザクション処理は次のように最適化されました。
<オル> ワーカー スレッドの ExecutorService。
トランザクション状態の ConcurrentHashMap。
アカウントレベルのロックのための ReentrantLock。
バッチ同期用の CountDownLatch。
非同期応答の CompletableFuture。
結果:スループットが 35% 向上し、レイテンシが 40% 削減されました。
31) Java の仮想スレッド。
Java 21 で導入された仮想スレッドは、JVM によって管理される軽量のスレッドで、最小限のオーバーヘッドで数百万の同時タスクを可能にします。
| 機能 | プラットフォーム スレッド | 仮想スレッド |
| 管理者 | OS | JVM |
| 作成コスト | 高い | 非常に低い |
| 同時実行レベル | 千 | 数百万 |
| スケジュール | OS レベル | JVM 連携 |
| 使用例 | CPU 依存タスク | I/O バウンド / 同時実行性の高いタスク |
テーブル> Thread.startVirtualThread(() -> System.out.println("Virtual thread running")); 32) 構造化された同時実行性。
Java 21 でプレビューされた構造化同時実行機能は、複数の同時タスクを 1 つの単位として扱い、それらが同時に開始、管理、終了されることを保証します。これにより、孤立したスレッドが排除され、エラーの伝播が簡素化されます。
try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
Future user = scope.fork(() -> findUser());
Future order = scope.fork(() -> fetchOrderCount());
scope.join();
scope.throwIfFailed();
System.out.println(user.resultNow() + " has " + order.resultNow() + " orders.");
} 33) Java のリアクティブ ストリーム。
Reactive Streams は、データ ストリームを処理するためのノンブロッキングでバックプレッシャーを認識するモデルを提供し、Project Reactor、RxJava、Spring WebFlux などのフレームワークの基盤を形成します。
Publisher – データを生成します。
Subscriber – データを消費します。
Subscription – フローを制御します。
Processor – パブリッシャーとサブスクライバーの両方
Flow.Publisher publisher = subscriber -> subscriber.onNext(42);
34) 適切なスレッド割り込み処理。
常に Thread.interrupted() を確認してください ループ内でリソースをクリーンアップし、InterruptedException をキャッチした後に割り込みステータスを保存します。 .
while (!Thread.currentThread().isInterrupted()) {
try { Thread.sleep(1000); }
catch (InterruptedException e) {
Thread.currentThread().interrupt(); // restore flag
break;
}
} 35) 並列処理と同時実行。
同時実行では実行をインターリーブすることで複数のタスクを管理し、並列では複数の CPU コア間でタスクを同時に実行します。
| コンセプト | 定義 | 例 |
| 同時実行性 | タスクをインターリーブする | 1,000 個のクライアント リクエストを同時に処理する |
| 並列処理 | 同時実行 | CPU コア全体での計算の実行 |
テーブル> 36) スレッド プロファイリング ツールとテクニック。
| ツール | 目的 |
| jstack | スレッドダンプキャプチャ |
| jconsole / VisualVM | リアルタイム監視 |
| Java フライト レコーダー (JFR) | 低オーバーヘッドのプロファイリング |
| ミッションコントロール (JMC) | JFR 録音の視覚化 |
| 非同期プロファイラー | CPU と割り当てのプロファイリング |
| ThreadMXBean | プログラムによる検査 |
テーブル> ThreadMXBean bean = ManagementFactory.getThreadMXBean();
System.out.println(bean.getThreadCount());
37) 一般的なパフォーマンスのボトルネック。
<オル> 過度のロック競合。
変数の誤った共有。
コンテキスト切り替えのオーバーヘッド。
不適切な同期。
揮発性変数の過剰使用。
最適化には、きめ細かいロック、ロックフリー構造、スレッド作成の最小化、スレッドローカル ストレージの使用が含まれます。
38) ロックフリー、待機フリー、障害物フリーのアルゴリズム。
| タイプ | 定義 | 保証 |
| ロックフリー | 少なくとも 1 つのスレッドが進行します。 | システム全体の進捗状況。 |
| そのままお待ちください | すべてのスレッドは、制限されたステップで進行します。 | 最も強力な保証。 |
| 障害物がない | 競合がない場合の進捗。 | 最も弱い保証。 |
テーブル>
AtomicInteger の操作はロックフリーです。ブロッキングキューはロックを使用します。
39) ForkJoinPool の内部。
各ワーカーは独自の両端キューを維持します。アイドル状態のワーカーは他のワーカーからタスクを盗むため、競合が減り、スループットが向上します。
ForkJoinPool pool = new ForkJoinPool();
pool.submit(() -> IntStream.range(0, 100).parallel().forEach(System.out::println));
40) 数百万のリクエストに対応する高度な同時システムの設計。
<オル> 軽量なリクエスト処理のための仮想スレッド
非同期 I/O 用のリアクティブ ストリーム
予測可能なタスクのライフサイクルを実現する構造化同時実行性
高性能キャッシュ(ConcurrentHashMap、Caffeine)
スレッドセーフなキュー (Disruptor、BlockingQueue)。
JFR と JMC によるモニタリング
非同期ワークフロー用の CompletableFuture。
結果:ブロッキングを最小限に抑え、リソースを最適に使用することで、数百万の同時接続を実現します。
🔍 Java マルチスレッドに関する面接でよくある質問と現実世界のシナリオと戦略的回答
以下に、10 の現実的な質問、面接官が期待するもの、洗練された回答例を示します。
1) Java のプロセスとスレッドの違いは何ですか?
受験者は、OS と JVM の基礎、メモリ使用量、実行フローについて説明する必要があります。たとえば、ブラウザ プロセスには、レンダリング、ネットワーク、ユーザー入力のための複数のスレッドが含まれています。
2) synchronized の目的 キーワード?
同時実行制御、固有ロック、スレッド セーフについて説明します。これにより、一度に 1 つのスレッドだけがクリティカル セクションにアクセスすることが保証されます。
3) マルチスレッドに関する困難な問題に直面し、解決されましたか?
デッドロックのシナリオと、スレッド ダンプによってデッドロックのシナリオをどのように特定し、一貫したロック順序を適用することで解決したかについて説明します。
4) Java メモリ モデルと可視性?
前に起こる関係を説明します、volatile 、および可視性と順序を保証する同期構造。
5) wait() の違い 、notify() 、および notifyAll() ?
スレッド間通信と監視の仕組みを説明します。
6) マルチスレッド アプリケーションを最適化しますか?
ロック競合を特定し、synchronized を置き換えます ConcurrentHashMap を使用 、測定可能なスループットの向上を示します。
7) 共有データ構造を安全に更新しますか?
スレッドセーフなコレクションまたは ReentrantLock による明示的なロックを使用する きめ細かい制御が可能です。
8) ExecutorService の役割 ?
ワーカー スレッドのプールを管理し、オーバーヘッドを削減し、ライフサイクル管理を簡素化します。
9) 競合状態のトラブルシューティングを行いますか?
負荷がかかっている状態で再現し、ロギングを強化し、適切な同期を追加して修正します。
10) さまざまな優先順位を持つマルチスレッド ソリューションを設計しますか?
ThreadPoolExecutor でプライオリティ キューを使用する 優先度の高いタスク用のカスタム コンパレータ。