Javaの基本的な面接の質問と回答(C)

マルチスレッド

35.並列と並行の違いは何ですか?

  • 平行な複数のイベントが同時に発生することを意味し、同じ時間間隔で発生する二つ以上の同時イベントを指します。

  • 異なるエンティティ上での並列複数のイベント、同じエンティティの同時複数のイベント。

  • シングルプロセッサ「同時」プロセスで複数のタスクを同時に複数のプロセッサ間で複数のタスクを処理します。Hadoopの分散クラスタとして。

そのため、並行プログラミングの目標は、完全に最高の処理性能を達成するために、すべてのコアプロセッサを利用することです。

 

36スレッドとプロセスの違いは?

要するに、プロセスは、プロセスは、少なくとも一つのねじ山を有し、プログラムは、少なくとも1つのプロセスを有する、基本単位プログラムの実行及びリソース割り当てです。実行プロセスの間に別個のメモリユニットを有しており、複数のスレッドがメモリリソースを共有する、スイッチング周波数を低減し、より効率的。スレッドは、物理的プロセスであるCPUスケジューリングとディスパッチの基本単位は、独立して動作することができる基本的な単位のプログラムよりも小さいです。あなたは、同じプロセスで複数のスレッド間で同時に実行することができます。

 

37.どのようなスレッドは、保護者ですか?

(つまり、デーモンスレッド)デーモンスレッドは、正確には、それが他のスレッドを提供することです、サービスのスレッドです。

 

38スレッドを作成するさまざまな方法は何ですか?

①。継承ThreadクラスのThreadクラスが作成されます

  • Threadクラスのサブクラスの定義とは、タスクを完了するために、スレッドのrunメソッドを表すクラス、メソッド本体のrunメソッドをオーバーライドします。したがってrun()メソッドが実行可能と呼ばれています。

  • スレッドオブジェクトを作成したスレッドのサブクラスのインスタンスを作成します。

  • スレッドを開始するスレッドオブジェクトのstart()メソッドを呼び出します。

②。、Runnableインタフェースクラスを介してスレッドを作成します。

  • 実行可能な定義されたインタフェースの実装クラス、インタフェース、実行スレッドの同じスレッドの実行を無効に()メソッド、メソッド本体のrun()メソッド。

  • Runnableを実装クラスのインスタンスを作成し、そのスレッドのThreadオブジェクトを作成するために、ターゲットの一例として、Threadオブジェクトは、実際のスレッドオブジェクトです。

  • スレッドを開始するスレッドオブジェクトのstart()メソッドを呼び出します。

③。呼び出し可能と未来を通じてスレッドを作成します。

  • 呼び出し可能インターフェースの実装クラスを作成し、実行、および戻り値のスレッドとして()メソッドの呼び出し、呼び出し()メソッドを実装します。

  • 呼び出し可能な値を返す()メソッドの呼び出しのFutureTask呼び出し可能オブジェクトをカプセル化するオブジェクト呼び出し可能FutureTaskクラスオブジェクトを、包装用いて、実装クラスのインスタンスを作成します。

  • 作成し、新しいスレッドを開始するために、ターゲットオブジェクトとしてFutureTaskスレッドオブジェクトを使用します。

  • サブスレッドの実行が終了した後、戻り値を取得するFutureTaskオブジェクトのget()メソッドを呼び出します。

 

39の違いは何実行可能と呼び出し可能なものであると言いますか?

少し深く問題、また学ぶためにJavaプログラマの知識の幅を参照してください。

  • 戻り値の実行、Runnableインタフェース()メソッドは、ちょうどそれが純粋にそれでrun()メソッドのコードを実行するか、無効です。

  • 呼び出し可能インタフェース()メソッドを呼び出すことは、値を返す一般的であり、そして今後、FutureTaskは実行とは非同期に結果を得るために使用することができます。

 

40.スレッドの状態は何ですか?

スレッドは、通常、5つの状態、作成、準備、実行し、ブロックし、死を持っています。

  • 状態を作成します。世代スレッドオブジェクトでは、オブジェクトのメソッドを起動して呼び出すことはありません、これは、スレッドの状態が作成されています。

  • 準備完了状態。ときにスレッドオブジェクトの通話開始方法、準備完了状態にスレッドが、今回はスレッドスケジューラは、現在のスレッドにスレッドに準備完了状態で、この時間がかかることはありません。また、準備完了状態で、待機しているか、寝た後に戻ってから、実行中のスレッドの後。

  • 実行。スレッドは、スレッドが実行状態になり、実行機能コードの中で実行を開始、現在のスレッドのレディ状態にスレッドスケジューラを設定します。

  • 状態をブロックします。スレッドを実行している場合、それは通常、特定の時間に起き、その後、(準備ができて、例えばリソース)をした後に実行を継続するために待機しているため、中断されます。睡眠は、サスペンドスレッドを待って、他の方法は、閉塞につながることができます。

  • 死の状態。実行終了のスレッドrunメソッドまたはstopメソッドが呼び出された場合、スレッドが死にます。スレッド死者のために、あなたはもう準備にそれを作るためにstartメソッドを使用することはできません   

 

41.睡眠()と(待つ)の違いは何ですか?

睡眠():メソッドは、スレッドクラス(スレッド)の静的メソッド、呼び出し元のスレッドが睡眠時間の終わりまで、レディ状態にスレッドと他のスレッドが一緒に実行時間のCPUの競合、他のスレッドに機会の実装を出す、スリープ状態になるようです。睡眠は()静的な静的なアプローチであるため、彼は同期ブロックと呼ばれる睡眠()メソッドは、スレッドががスリープ状態になるターゲット・マシンのロックを、変更することはできませんが、マシンロックオブジェクトが解放されていない、他のスレッドはまだこのにアクセスすることはできませんオブジェクト。

)(待って:()スレッドがメソッドを待つために実行されるオブジェクト・クラスの方法を待って、それがを介して、オブジェクト、他のスレッドがアクセスできるように、マシンのロックを解除しながら、オブジェクトに関連付けられた待機プールに進み通知、スレッドを待っているウェイクアップするのnotifyAllメソッド

 

42.通知()とのnotifyAll()の違いは何ですか?

  • スレッドがオブジェクトの待機()メソッドを呼び出した場合は、スレッドプールのスレッドがオブジェクトをロックする競争を待ちません、待機プールに対象となります。

  • スレッドがのnotifyAllオブジェクトを呼び出す()メソッドがある場合や通知()メソッド(ランダムでのみ待機スレッドを目覚め)、スレッドを目覚めオブジェクトのプールをロックするために行く、プールをロック(すべてのスレッドを待って目を覚まします)オブジェクトのために競争するためのスレッドロック。言い換えれば、限りコールとしてロックプールでプールに入るのを待っているスレッドに通知する、とのnotifyAllは、ロックが競争するのを待つ、プールをロックするために待機しているプールスレッド内のすべてのオブジェクトを移動します。

  • スレッドがオブジェクトロックへの競争ではない場合、大きなオブジェクトの確率をロックするために、競合する優先度の高いスレッドは、それがロックプールに滞在する、唯一のスレッドは再び()メソッドを待って呼び出し、それは待っているプールに戻りますインチ 実行は、コードの同期ブロックの上になるまでスレッドの実行をロックダウンするために競争対象が続く、それは、スレッドプールは、オブジェクトのロックを競うし続けるロック、オブジェクトのロックを解放します。

 

43.スレッドのrun()およびstart()の違いは何ですか?

各スレッドは、その操作を完了するために)特定の目的は、(スレッド対応のプロセスによって実行され、メソッドの実行()は、そのスレッドと呼ばれます。Threadクラスのstart()メソッドを呼び出すことにより、スレッドを開始します。

スレッド、真のマルチスレッド動作を開始する()メソッドを起動します。このスレッドが準備完了状態にあり、実行されていない。そして、完成されたrunメソッドボディコードの実行を待たずに、次のコードに直接進むこともできます。そして、この方法は終了するために、このスレッドを実行するために、Runメソッドを終了し、実行されるように、このスレッドの内容が含まれているメソッドの実行は、()スレッド体と呼ばれ、その動作状態を、完了するためにThreadクラスの実行を()を呼び出します。その後、CPUは他のスレッドを再スケジュール。

このスレッド()メソッドを実行し、スレッドが唯一の機能であるが、マルチスレッドではありません。唯一、直留スタンド()メソッドは、実行を待つ必要があります()メソッドは、次のコードを実行するために仕上がって実行するための直接呼び出しは()、実際には、一般的な関数を呼び出すのと同等で、それはまだ唯一の実行パスである場合、スレッドはありません機能、あなたが実行開始の複数のスレッドを使用したい場合()メソッドの代わりに、run()メソッド。

 

44.いくつかの方法がありますスレッドプールを作成しますか?

①。newFixedThreadPool(int型にnthreads)

端部がスレッドは、スレッドプールを補完するときに予期しないエラーが発生した場合、プール内のスレッドの最大数は、スレッドのサイズが変更されないまでタスクは、スレッドを作成するたびに提出された固定長を作成しますが、スレッドプール新しいスレッド。

②。newCachedThreadPool()

スレッドプールのサイズは、処理要件を超えた場合、自動的にアイドル状態のスレッドを再利用し、キャッシュされたスレッドプールを作成し、需要が増加すると、自動的に新しいスレッド、任意の制限の不在のスレッドプールのサイズを追加することができるとき。

③。newSingleThreadExecutor()

スレッドが異常終了した場合、これはシングルスレッド執行され、それがタスクを実行するために、単一のワーカースレッドを作成し、それを置き換えるために新しいものを作成します。キュー内のタスクの順序に従ってシリアル実行を確保するために特徴があります。

④。newScheduledThreadPool(int型corePoolSize)

これは、スレッドプールの固定長を作成し、タイマと同様のタスクを実行するために遅延または時間するように。

 

45.スレッドプールのステータスは何ですか?

実行、シャットダウン、停止、整頓、終端:スレッドプールは、5つの状態があります。

図フレームの各スレッドプール状態スイッチ:

 

46.スレッドプールを提出()およびexecute()メソッドの違いは何ですか?

  • 受信したパラメータは同じではありません

  • 返します値を提出しますが、実行はしませんでした

  • 便利な例外処理を提出

 

マルチスレッドの安全な動作を確保するためにどのようにJavaプログラムで47?

スレッドの安全性は、三つの側面に反映されます。

  • アトミック:(同期化、アトミック)、データを操作するために一度に一つのスレッド、排他的なアクセスを提供します。

  • 可視性:適切なタイミングでメインメモリのスレッドの変更は、他のスレッド、(揮発性、同期化)によって見ることができます。

  • 注文:スレッド他のスレッドが命令の並べ替えするので、実行順序を守って、この観察は、(事前発生主義)、一般的に無秩序です。

 

48.マルチスレッドロックのアップグレードの原理はどのようなものですか?

Javaでは、ロックは四つの状態、ローからハイ順番にレベルを含む:なし状態のロック、ロックバイアス、軽量かつヘビー級ロックロック状態を、これらの状態はエスカレート状況と競合します。ロックはアップグレードできますが、ダウングレードすることはできません。

ロック・エスカレーションプロセス図: 

 

 

49.デッドロックとは何ですか?

デッドロックは、外部の力なしで、彼らはそれを促進することができなくなり、によるリソースの競合または起因互いに通信引き起こされるブロッキング現象を、実装プロセス内の2つの以上のプロセスを指します。この時点で、システムがデッドロック状態やデッドロックと呼ばれる別のプロセスを待っているの過程で常にデッドロックを生成するためのシステムであると言います。最初の1965年に銀行家のアルゴリズムの研究でダイクストラによって提案された間違ったオペレーティング・システム・レベルは、プロセスがデッドロックと呼ばれ、され、それは問題のあるコンピュータのオペレーティングシステムおよびに対処するため、並行プログラミングのフィールド全体が困難です。

 

50.どのようにデッドロックを防ぐために?

4つの要件をデッドロック:

  • 相互に排他的な条件は:資源配分のプロセスは他のプロセスがリソースにアクセスする場合、唯一の完成されたプロセスが使用するリソースを所有しているリソースの解放後まで待つことができ、アクセスに他のプロセスを可能にします

  • いくつかのリソースを取得するプロセスの後、だけでなく、追加のリソースを要求したが、リソースが別のプロセスによって占有されて、問題が要求をブロックしますが、独自のリソースに保留されました:要求と条件を維持

  • 不可分の条件は:未完、不可分、私たちの唯一の解放後使用を使用する前に取得したリソースのプロセスを指し

  • ループ待ち状態:これは、プロセス、デッドロック、関係を終了するリソースの終了を待つ複数のプロセスの間に形成されたコンタクトの円を指し

これらの4つの条件がある限り、システムのデッドロックとして、これらの条件の確立が避けられないが、限り、上記のいずれかの条件が満たされていないとして、それはデッドロックを発生しません、デッドロックのために必要な条件です。

デッドロックのために特に必要な4つの条件、デッドロックの理由を理解し、それがデッドロックを避ける予防および緩和することが可能にしました。

だから、必要な4つの条件を維持するためにどのようにシステム設計、プロセススケジューリング、という点で注意を払うは永久に占有し、システムリソースのプロセスを回避するために、合理的な資源配分アルゴリズムをどのように決定するか、満たされています。

また、我々は、プロセスが待機状態なしでリソースを消費防ぐ必要があります。そのため、リソースの割り当ては、合理的な計画を与えられるべきです。


51. ThreadLocalのそれとは何ですか?使用シナリオは何ですか?

スレッドローカル変数はすべて、複数のスレッド間で、糸自体に属し、内部のスレッドを制限された変数が共有されていないです。ThreadLocalのJavaはスレッドローカル変数のためのクラスを提供し、それがスレッドセーフを達成するための方法です。ただし、(Webサーバなど)環境の管理下に長い任意のアプリケーション変数のライフサイクルよりも、この場合には、特に注意する労働者のライフサイクルを時間のスレッドローカル変数を使用しました。作業が完了した後、任意のスレッドローカル変数が解除されていないならば、Javaアプリケーションは、メモリリークの危険性があります。

 

基本原理を達成するための同期について52話?

または方法は、メモリ共有変数の可視性を保証することができながら、唯一の方法は、クリティカル領域に入るようにすることを、動作中のその同期コード・ブロックを確保することができます。

Javaで各オブジェクトは、基盤の同期化を達成するために同期されているロックとして使用することができます。

  • 一般的な同期方法は、ロックオブジェクトの現在のインスタンスであります

  • 静的な同期メソッドは、オブジェクトのロックは、現在のクラスのクラスであります

  • オブジェクトのロックが括弧内にあるブロックの同期方法、


違い53が同期してその揮発性とは何ですか?

  • 揮発性の性質はレジスタにJVM現在の変数の値を語っている(ワーキングメモリ)が、定かではメインメモリから読み出される必要がある。同期現在の変数は、現在のスレッドのみが変数にアクセスすることができ、ロックされ、他のスレッドが生きてブロックされています。

  • 同期変数は、方法で使用することができ、クラスレベル、揮発性のレベルは、変数で使用することができます。

  • 可視性とアトミック変数を確保することができ、同期や修正、揮発性、視認性は、それが原子性を保証するものではありません、変数を変更達成することができます。

  • 同期閉塞スレッドを引き起こす可能性があり、揮発性が閉塞スレッドが発生しません。

  • 変数揮発性フラグは、コンパイラ最適化されないであろう。マークは、可変最適化コンパイラを同期させることができます。

 

54.同期との違いは何ですかロック?

  • 最初のキーワードは、JVMレベルで構築されたJavaで同期、ロックはJavaクラスです。

  • ロック状態を取得するかどうかを決定することができない同期、ロックは、ロックを取得するかどうかを決定することができます。

  • 自動的に同期ロック解放(ロックを解除します同期コードを実行した後のスレッドを、ロックBスレッド実行中に発生する異常解除)、手動でロックを解除するロック必要は最終的にで(ロックを解除する)(メソッドのロックを解除)、又は死亡するスレッドを引き起こす可能性ロック;

  • 現在のスレッドがロック、スレッド2、スレッドの待機を取得する場合、2つのスレッド1とスレッド2、1とキーワードを同期。ロックロックは、必ずしももはや待つことはありませんしながら、ブロックされたスレッド1は、スレッド2は、永遠に待つことになる場合は、超えているあなたは待つことができないスレッドをロックしようとした場合よりも少ないを取得します。

  • 同期リエントラントロックは、不公平に中断することができず、ロックリエントラントロックは、公正(両方とも利用可能)も測定することができます。

  • 質量同期同期コードに適したロックロックは、コードの同期の問題の少量のためにロックを同期。

 

55.同期とReentrantLockの違いは何ですか?

これは、同期された場合、それ以外の、ため、同じキーワードながら、ReentrantLockのは、二つの間の本質的な違いである、クラスです。ReentrantLockのクラスがあるので、それは、あなたが、あなたはクラス変数、ポイントに反映さよりもスケーラビリティ同期ReentrantLockの様々な構造を有することができることができる方法がある同期の特性を継承することができますより多くの柔軟性を提供します。 

  • ReentrantLockのは、このようにデッドロックを回避、ロック待機時間を取得するように設定することができます 

  • ReentrantLockのは、様々なロックに関する情報を得ることができます

  • マルチチャンネルの通知を達成するためのReentrantLockの柔軟性 

また、ロック機構の両方が、実際には同じではない:ReentrantLockの基礎となるメソッド呼び出しは、公園の安全でないロックされ、同期操作は、対象ヘッダマークワードであるべきです。


アトミック原則について56話?

排他原子パケットが単一にするとき、複数のスレッドが同時に、マルチスレッド環境である(基本タイプと参照タイプを含む)クラスの基本的な機能可変操作、すなわち、ときに複数のスレッドの値を同時に可変更新する際に、1つのスレッドのみ成功することができますが、成功していないスピンスレッドが成功するまで、努力を続けるために同じをロックすることができます。

コアメソッド内のクラスのアトミックシリーズは、安全でないクラス、いくつかのローカルメソッドを呼び出します。私たちは、ものが安全でないクラスである知っている必要があり、フルネーム:sun.misc.Unsafe、このクラスは、多くのダイレクトメモリ割り当てを含むCコードの操作が多数、含まれているとアトミックオペレーションを呼び出し、それがノンマーキング理由です安全性、などC ++のようなものにつながる可能性、セキュリティリスクも注意して使用する必要があり、彼らは特定の領域を指定した場合、それ以外の場合は、危険な割り当てられたメモリにより時間などの重大な結果につながるだろうあなたにこのコール内部の多くの方法を伝えることです国境を越えた問題は、他のプロセスへのポインタ。

おすすめ

転載: www.cnblogs.com/donleo123/p/11621036.html
おすすめ