Java スレッドのインタビューの質問
マルチスレッドと同時実行性に関する質問は、Java の面接で不可欠な部分です。株式投資銀行でフロントオフィスの情報職に就きたい場合は、マルチスレッドに関する多くの質問を準備しておく必要があります。マルチスレッドと同時実行性は、特に電子取引の開発に関連する投資銀行業務において非常に人気のあるトピックです。彼らは面接官に、Java スレッドに関するわかりにくい質問をたくさんします。多くの候補者はほんの表面をなぞっただけであるため、面接官は Java スレッドと同時実行性について十分な知識があることを確認したいだけです。市場直接取引のための大量かつ低遅延の電子取引システムは、本質的に同時実行されます。以下は、私がさまざまな時間や場所で尋ねたい Java スレッドに関する質問です。私は答えを提供しませんが、可能な限りヒントを提供します。場合によっては、それらのヒントが質問に答えるのに十分である場合もあります。 Java 5 同時実行パッケージを参照する同時実行ツールおよび同時実行コレクションに関する質問が増えています。これらの問題の中で、ThreadLocal、Blocking Queue、Counting Semaphore、および ConcurrentHashMap がより一般的です。
Java マルチスレッドに関するインタビューの 15 の質問と回答
1) 現在、3 つのスレッド T1、T2、および T3 があります。T1 の実行後に T2 が実行され、T2 の実行後に T3 が実行されるようにするにはどうすればよいですか?
このスレッドの質問は、通常、最初のラウンドまたは電話面接の段階で、「参加」方法に精通しているかどうかをテストするために尋ねられます。このマルチスレッドの問題は比較的単純で、join メソッドを使用して実装できます。
2) Java の同期ブロックに対する Lock インターフェースの利点は何ですか?複数のユーザーが読み取りを許可し、書き込みは 1 人のユーザーのみが許可する効率的なキャッシュを実装する必要があります。これにより、整合性が維持されます。これをどのように実装しますか?
マルチスレッドおよび同時プログラミングにおけるロック インターフェイスの最大の利点は、読み取りと書き込みに個別のロックが提供されることです。これにより、ConcurrentHashMap や条件付きブロックなどの高性能データ構造を作成できるようになります。 Java スレッドの面接の質問は、面接者の回答に基づいて行われることが増えています。 Locks は現在、電子取引端末を構築するためのクライアント側のキャッシュおよび取引接続スペースで頻繁に使用されているため、マルチスレッド面接に行く前に Locks についてよく読んでおくことを強くお勧めします。
3) Java の wait メソッドと sleep メソッドの違いは何ですか?
Java スレッドのインタビューで通常電話インタビューで尋ねられる質問。最大の違いは、wait は待機中にロックを解放しますが、sleep は常にロックを保持していることです。通常、待機はスレッド間の対話に使用され、スリープは通常、実行を一時停止するために使用されます。
4) Java を使用してブロッキング キューを実装します。
これは、多くの目的に役立つ比較的難しいマルチスレッドの面接の質問です。 1 つ目は、受験者が実際に Java スレッドを使用してプログラムを作成できるかどうかをテストでき、2 つ目は、受験者が同時実行シナリオについて理解しているかどうかをテストでき、これに基づいて多くの質問をすることができます。ユーザーが wait() メソッドと Notice() メソッドを使用してブロッキング キューを実装する場合は、Java 5 の最新の同時実行クラスを使用してキューを再度作成するように依頼できます。
5) 生産者と消費者の問題を解決するコードを Java で作成します。
上記の質問と非常に似ていますが、この質問はより古典的なもので、面接で次のような質問がされることがあります。 Java でプロデューサーとコンシューマーの問題を解決するには? もちろん、ブロッキング キューを使用した解決策はたくさんあります。時には、食事の哲学者の問題をどのように実装すればよいか尋ねることもあります。
6) Java でデッドロックを引き起こすプログラムを作成した場合、それをどのように解決しますか?
これは私のお気に入りの Java スレッド面接の質問です。なぜなら、マルチスレッド同時実行プログラムを作成するときにデッドロックの問題が非常によくあるにもかかわらず、多くの受験者がデッドロックのないコード (デッドロックのないコード?) を書くことができず、苦労しているからです。 N 個のリソースと N 個のスレッドがあり、操作を完了するにはすべてのリソースが必要であることを伝えてください。簡単にするために、ここでの n は 2 に置き換えることができます。データが大きくなると、問題がより複雑に見えます。デッドロックの詳細については、「Java でのデッドロックの回避」を参照してください。
7) Java のアトミック操作とは何ですか?
非常に単純な Java スレッドのインタビューの質問です。次の質問は、アトミック操作を同期する必要があるというものです。
8) Java における volatile の重要な役割は何ですか?使い方は? Java の同期メソッドとの違いは何ですか?
Java 5 と Java メモリ モデルが変更されて以来、volatile キーワードに基づくスレッドの問題がますます一般的になってきました。同時環境で揮発性変数が可視性、順序付け、一貫性をどのように確保するかについての質問に答える準備をしておく必要があります。
9) 競合状態とは何ですか?競合をどのように特定して解決しますか?
これは、マルチスレッド面接の上級段階で出てくる質問です。ほとんどの面接官は、あなたが最近遭遇した競争条件と、それをどのように解決したかについて質問します。場合によっては、単純なコードを記述して、コード内の競合状態を検出できるようにすることもあります。 Java 競合状態に関する私の以前の記事を参照してください。私の意見では、これは Java スレッドの面接で最高の質問の 1 つであり、候補者の競合状態の解決、またはデータ競合やその他の競合状態のないコードの作成における経験を正確に検出できます (データ競合のないこの文は、翻訳しません)。このテーマに関する最良の本は、『Java の同時実行プラクティス』です。
10) スレッドダンプはどのように使用しますか?スレッド ダンプをどのように分析しますか?
UNIX では kill -3 を使用すると、スレッド ダンプによってログが出力されます。Windows では、「CTRL+Break」を使用できます。非常にシンプルで専門的なスレッドのインタビューの質問ですが、それを分析する方法を尋ねられると難しいです。
11) start() メソッドを呼び出すときに run() メソッドが実行されるのはなぜですか? run() メソッドを直接呼び出すことができないのはなぜですか?
これも非常に古典的な Java マルチスレッドに関する面接の質問です。これは、私が最初にスレッド プログラムを書き始めたときの混乱でもありました。現在、この質問は通常、電話面接、または初心者から中級レベルの Java 面接の最初のラウンドで尋ねられます。この質問に対する答えは次のようになります。 start() メソッドを呼び出すと、新しいスレッドが作成され、 run() メソッドのコードが実行されます。ただし、 run() メソッドを直接呼び出した場合、新しいスレッドは作成されず、呼び出しスレッドのコードも実行されません。詳細については、以前の記事「開始メソッドと実行メソッドの違い」を参照してください。
12) Java でブロックされたスレッドを起動するにはどうすればよいですか?
これはスレッドとブロッキングに関する難しい質問であり、多くの解決策があります。 IO ブロックに遭遇した場合にスレッドを中止する方法はないと思います。 wait()、sleep()、または join() の呼び出しによってスレッドがブロックされた場合、InterruptedException をスローすることでスレッドを中断し、ウェイクアップできます。前回の記事「Java でメソッドのブロッキングに対処する方法」には、スレッドのブロッキングへの対処に関する多くの情報が記載されています。
13) Java における CycliBarriar と CountdownLatch の違いは何ですか?
このスレッドの質問は主に、JDK5 の同時実行パッケージに精通しているかどうかをテストするために使用されます。 2 つの違いは、CyclicBarrier は通過したバリアを再利用できるのに対し、CountdownLatch は再利用できないことです。
14) 不変オブジェクトとは何ですか?また、それは同時アプリケーションの作成にどのように役立ちますか?
マルチスレッドに関するもう 1 つの古典的な面接の質問は、スレッドとは直接関係ありませんが、間接的に非常に役立ちます。この Java 面接の質問で、不変オブジェクトを書くように求められたり、String が不変である理由を尋ねられたりすると、非常に扱いにくくなる可能性があります。
15) マルチスレッド環境で遭遇する一般的な問題は何ですか?どうやって解決しましたか?
マルチスレッドおよび同時プログラムでよく発生するのは、メモリ インターフェイス、競合状態、デッドロック、ライブロック、および飢餓です。問題は無限にあり、間違った場合は、発見してデバッグすることが困難になります。これは主にインタビューベースであり、実際のアプリケーションベースの Java スレッドに関する質問ではありません。
追加の質問がいくつかあります:
1) Java のグリーン スレッドとローカル スレッドの違いは何ですか?
2) スレッドとプロセスの違いは何ですか?
3) マルチスレッドにおけるコンテキストスイッチングとは何ですか?
4) デッドロックとライブロックの違い、およびデッドロックとパイの違いは何ですか?
5) Java で使用されるスレッド スケジューリング アルゴリズムは何ですか?
6) Java のスレッド スケジューリングとは何ですか?
7) スレッド内でキャッチできない例外をどのように処理しますか?
8) スレッド グループとは何ですか? Java ではなぜ推奨されないのですか?
9) スレッドの作成と管理には、アプリケーションを使用するよりも Executor フレームワークを使用する方が良いのはなぜですか?
10) Java の Executor と Executor の違いは何ですか?
11) Windows と Linux で最も CPU 時間を使用しているスレッドを見つけるにはどうすればよいですか?