インタビューはナレッジポイント-マルチスレッド、50のインタビューの質問の要約を尋ねる必要があります(推奨コレクション)

ゴールデンナインシルバーテン、就職活動のピーク、最新かつ最も包括的なマルチスレッドの同時面接50の質問と回答の要約、BATに参加したい学生に役立つことを願っています。スペースが長いため、収集後に注意深く読むことをお勧めします〜

スペースが限られているため、ここには一部のみが表示され、残りのナレッジポイントはドキュメントにまとめられています。必要な友達は、下のリンクをクリックして無料で入手できます!

リンク:1103806531パスワード:CSDN

1.並行プログラミングの3つの要素?

1)原子性

原子性とは、1つ以上の操作を指します。すべて実行され、実行中に他の操作によって中断されないか、すべて実行されません。

2)可視性

可視性とは、複数のスレッドが共有変数を操作するときに、1つのスレッドが変数を変更した後、他のスレッドが変更の結果をすぐに確認できることを意味します。

3)秩序

秩序性、つまりプログラムの実行順序は、コードの順序で実行されます。

2.可視性を実現する方法は何ですか?

同期またはロック:1つのスレッドのみがロックを取得して同時にコードを実行し、可視性を実現するためにロックが解放される前に最新の値をメインメモリにフラッシュするようにします。

3.マルチスレッドの価値は?

1)マルチコアCPUを活用する

マルチスレッドは、マルチコアCPUの利点を実際に発揮し、CPUを最大限に活用する目的を達成し、マルチスレッドを使用して、互いに干渉することなく同時に複数のことを完了することができます。

2)ブロッキングを防ぐ

プログラムの効率の観点から見ると、シングルコアCPUはマルチスレッドの利点を発揮するだけでなく、シングルコアCPUで複数のスレッドを実行することによりスレッドコンテキストの切り替えを引き起こし、プログラムの全体的な効率を低下させます。ただし、シングルコアCPUの場合は、ブロックを防ぐために、マルチスレッドを使用する必要があります。シングルコアCPUがシングルスレッドを使用している場合、たとえば、特定のデータをリモートで読み取るなど、スレッドがブロックされている限り、ピアは復帰せず、タイムアウト期間も設定されていないと、プログラム全体がデータが復帰する前になります。実行を停止しました。マルチスレッドを使用すると、この問題を回避できます。1つのスレッドのコード実行がデータの読み取りをブロックされていても、複数のスレッドが同時に実行されても、他のタスクの実行には影響しません。

3)モデル化が簡単

これは、それほど明白ではないもう1つの利点です。大きなタスクA、シングルスレッドプログラミングがあるとすると、多くの考慮事項があり、プログラムモデル全体を構築するのは面倒です。ただし、この大きなタスクAをいくつかの小さなタスク(タスクB、タスクC、およびタスクD)に分解し、プログラムモデルを個別に構築し、マルチスレッドでこれらのタスクを個別に実行すると、はるかに簡単になります。

4.スレッドを作成する方法は何ですか?

1)スレッドクラスを継承してスレッドクラスを作成する

2)Runnableインターフェイスを介してスレッドクラスを作成する

3)CallableおよびFutureを介してスレッドを作成する

4)スレッドプールにより作成

5.スレッドを作成する3つの方法の比較?

1)RunnableおよびCallableインターフェースを実装して、複数のスレッドを作成します。

利点

スレッドクラスは、RunnableインターフェイスまたはCallableインターフェイスのみを実装し、他のクラスから継承することもできます。

このようにして、複数のスレッドが同じターゲットオブジェクトを共有できるため、複数の同じスレッドが同じリソースを処理するのに非常に適しているため、CPU、コード、およびデータを分離して明確なモデルを形成し、より適切に反映できます。オブジェクト指向のアイデア。

短所

プログラミングは少し複雑です。現在のスレッドにアクセスする場合は、Thread.currentThread()メソッドを使用する必要があります。

2)Threadクラスを継承してマルチスレッドを作成する

優れた可能性:

現在のスレッドにアクセスする必要がある場合は、Thread.currentThread()メソッドを使用する必要はなく、これを直接使用して現在のスレッドを取得できます。

短所

スレッドクラスはThreadクラスを継承しているため、他の親クラスから継承することはできません。

3)RunnableとCallableの違い

呼び出し可能提供(オーバーライド)メソッドはcall()、実行可能提供(オーバーライド)メソッドはrun()です。
呼び出し可能なタスクは実行後に値を返すことができますが、実行可能なタスクは値を返すことができません。
Callメソッドは例外をスローできますが、runメソッドはできません。
Callableタスクを実行すると、非同期計算の結果を表すFutureオブジェクトを取得できます。これは、計算が完了したかどうかを確認し、計算が完了するのを待ち、計算の結果を取得する方法を提供します。Futureオブジェクトを通じて、タスクの実行を理解し、タスクの実行をキャンセルし、実行結果を取得できます。

6. Javaスレッドには5つの基本状態があります

1)新しい状態(新規):スレッドオブジェクトのペアが作成されると、次のような新しい状態になります。Thread t = new MyThread();

2)準備完了状態(実行可能):スレッドオブジェクトのstart()メソッド(t.start();)が呼び出されると、スレッドは準備完了状態になります。準備完了状態のスレッドは、スレッドが準備完了であり、CPUがいつでも実行をスケジュールするのを待っていることを意味するだけであり、t.start()の実行直後にスレッドが実行されるわけではありません。

3)実行状態(実行中):CPUがスレッドを準備状態でスケジュールし始めると、スレッドは実際に実行できます。つまり、実行状態になります。注:
作動可能状態への唯一のエントリーは、作動可能状態です。つまり、スレッドが実行のために作動状態に入ろうとする場合、最初に作動可能状態でなければなりません。

4)Blocked:何らかの理由で、running状態のスレッドは一時的にCPUの使用権を放棄して実行を停止します。このとき、スレッドはblocked状態になります。ready状態になるまで、CPUから再び呼び出される機会があります実行状態に入る。

ブロッキングのさまざまな原因に応じて、ブロッキング状態は3つのタイプに分類できます。

a。ブロッキングを待機中:実行状態のスレッドはwait()メソッドを実行して、スレッドを待機ブロッキング状態にします。

b。同期ブロッキング-スレッドは同期同期ロックの取得に失敗します(ロックが他のスレッドによって占有されているため)、同期ブロッキング状態になります。

c。その他のブロッキング-スレッドのsleep()またはjoin()を呼び出すか、I / O要求を発行すると、スレッドはブロッキング状態に入ります。sleep()状態がタイムアウトになると、join()はスレッドの終了またはタイムアウトを待機するか、I / O処理が完了すると、スレッドは再び準備完了状態になります。

5)デッドステート(Dead):スレッドは例外のために実行を終了するか、run()メソッドを終了し、スレッドはライフサイクルを終了します。

7.スレッドプールとは何ですか?それを作成する方法は何ですか?

スレッドプールは、事前にいくつかのスレッドを作成するためのものです。処理するタスクがある場合、スレッドプール内のスレッドがタスクを処理します。処理後、スレッドは破棄されず、次のタスクを待ちます。スレッドの作成と破棄はシステムリソースを消費するため、スレッドを頻繁に作成および破棄する場合は、スレッドプールを使用してシステムパフォーマンスを向上させることを検討できます。

Javaは、スレッドプールを作成するためのjava.util.concurrent.Executorインターフェイスの実装を提供します。

8.スレッドプールの利点は何ですか?

1)既存のスレッドを再利用して、オブジェクトの作成と破棄のオーバーヘッドを削減します。

2)同時スレッドの最大数を効果的に制御し、システムリソースの使用率を向上させ、過剰なリソースの競合とブロックを回避できます。

3)タイミング実行、定期実行、シングルスレッド、同時数制御などの機能を提供します。

9. CyclicBarrierとCountDownLatchの違い

1)CountDownLatchは、スレッドが待機している他のスレッドが実行されるまで待機し、countDown()メソッドが呼び出されて通知されることを意味します。現在のスレッドは実行を継続できます。

2)サイクリックバリアは、すべてのスレッドがawait()メソッドに入る準備ができるまで待機することであり、すべてのスレッドが同時に実行を開始します。

3)CountDownLatchのカウンターは1回しか使用できません。CyclicBarrierのカウンターは、reset()メソッドを使用してリセットできます。したがって、CyclicBarrierはより複雑なビジネスシナリオを処理できます(たとえば、計算でエラーが発生した場合、カウンターをリセットしてスレッドを再実行できます)。

4)CyclicBarrierは、CyclicBarrierによってブロックされたスレッドの数を取得するgetNumberWaitingメソッドなど、他の便利なメソッドも提供します。isBrokenメソッドは、ブロックされたスレッドが中断されているかどうかを知るために使用されます。中断された場合はtrueを返し、そうでない場合はfalseを返します。

10. volatileキーワードの役割

可視性のために、Javaはvolatileキーワードを提供して可視性を確保します。

シェア変数がvolatileによって変更されると、変更された値がメインメモリに即座に更新され、他のスレッドがそれを読み取る必要がある場合は、メモリに移動して新しい値を読み取ります。

実用的な観点から見ると、volatileの重要な役割はCASと組み合わせて原子性を確保することです詳細については、java.util.concurrent.atomicパッケージのクラス(AtomicIntegerなど)を参照してください。

11. CASとは

CASは、compare and swapの略語であり、compare exchangeと呼ばれています。

Casはロックベースの操作であり、楽観的ロックです。ロックは、Javaでは楽観的ロックと悲観的ロックに分けられます。悲観的ロックはリソースをロックすることであり、次のスレッドは、以前にロックを取得したスレッドがロックを解放した後でのみリソースにアクセスできます。楽観的ロックは幅広い態度を採用し、レコードにバージョンを追加してデータを取得するなど、ロックなしで何らかの方法でリソースを処理するため、悲観的ロックに比べてパフォーマンスが大幅に向上します。

CAS演算は、3つのオペランド-メモリ位置(V)、予想される元の値(A)、および新しい値(B)で構成されます。メモリアドレスの値がAの値と同じ場合、メモリの値はBに更新されます。CASは無限ループを介してデータを取得します。ループの最初のラウンドで、aスレッドによって取得されたアドレスの値がbスレッドによって変更された場合、aスレッドはスピンする必要があり、次のループで実行される可能性があります。

java.util.concurrent.atomicパッケージのほとんどのクラスは、CAS操作(AtomicInteger、AtomicBoolean、AtomicLong)を使用して実装されます。

12. CASの問題

1)CASはABAの問題を簡単に引き起こします

スレッドaが値をbに変更し、次にaに変更しました。現時点では、CASは変更がないと見なしていますが、変更されています。この問題の解決策はバージョン番号で識別でき、バージョンごとに1ずつインクリメントされます。 。java5では、問題を解決するためにAtomicStampedReferenceが提供されています。

2)コードブロックの原子性は保証できません

CASメカニズムは、変数のアトミック操作を保証しますが、コードブロック全体のアトミック性を保証することはできません。たとえば、3つの変数が一緒にアトミックに更新されるようにする必要がある場合は、同期を使用する必要があります。

3)CASによりCPU使用率が増加する

前述のように、CASは周期的な判断プロセスであり、スレッドがステータスを取得していない場合、CPUリソースは常に占有されます。

13.未来とは?

並行プログラミングでは、ノンブロッキングモデルをよく使用します。マルチスレッドの以前の3つの実装では、スレッドクラスを継承するか、実行可能なインターフェイスを実装するかにかかわらず、以前の実行結果が得られる保証はありません。Callbackインターフェースを実装し、Futureを使用することにより、マルチスレッド実行の結果を受け取ることができます。

Futureは、完了しない可能性がある非同期タスクの結果を表します。この結果については、タスクの実行が成功または失敗した後に、対応する操作を実行するためにコールバックを追加できます。

14. AQSとは

AQSはAbustactQueuedSynchronizerの略語です。これはJavaで改善された低レベルの同期ツールクラスです。int型の変数を使用して同期状態を表し、この同期状態を管理する一連のCAS操作を提供します。

AQSは、ロックとシンクロナイザーを構築するためのフレームワークです。AQSを使用すると、ReentrantLock、Semaphore、およびReentrantReadWriteLock、SynchronousQueue、FutureTaskなどの幅広いアプリケーション向けの多数のシンクロナイザーを簡単かつ効率的に構築できます。 AQSに基づいています。

15. AQSは2つの同期方法をサポートしています。

1)独占式

2)共有

これにより、ReentrantLockなどの排他型、Semaphore、CountDownLatchなどの共有型、ReentrantReadWriteLockなどの複合型など、さまざまな種類の同期コンポーネントを簡単に実装できます。つまり、AQSは、使用方法、組み立て方法、実現方法、ユーザーが自由にプレイできるようにするためのボトムサポートを提供しています。

やっと

この記事が皆様のお役に立てば幸いです。

私はまた、Javaのコアナレッジポイント、インタビュートピック、最新の20年間のインターネットの実際の質問や電子書籍など、Javaに関する建築家および体系的な資料の完全なビデオチュートリアルをまとめました。困っている友達は下のリンクをクリックして無料で入手できます!

リンク:1103806531パスワード:CSDN
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/XingXing_Java/article/details/108719612