インタビュアーのほとんどが尋ねたように:マルチスレッド、スレッドの同時実行の顔質問コメント(揮発性+ ThreadLocalの+スリープ)

1.スレッドとは何ですか?

スレッド、プロセス、単位工程の実際の動作に含まれる動作スケジュール、可能なオペレーティングシステムの最小単位です。プログラマは、あなたは、計算集約型の作業を加速するために、複数のスレッドを使用することができ、マルチプロセッサのプログラミングのためにそれを使用することができます。スレッドは100ミリ秒であることをタスクを完了する場合たとえば、その後、10個のスレッドを変更し、わずか10ミリ秒単位でタスクを完了します。

2、スレッドとプロセスの違いは何ですか?

スレッドは、プロセスが異なるタスクを実行するために、並行して各スレッドをスレッドの多くを有することができ、プロセスのサブセットです。異なる別のメモリ空間を使用するプロセス、およびすべてのスレッドが同じメモリ空間を共有しています。各スレッドは、ローカルデータを格納するために使用される別個のスタックメモリを有しています。

3、どのようにJavaでスレッドを実装するには?

二つの方法では:あなたはjava.lang.Threadのをクラスを継承するか、直接呼び出すことができるようにThreadクラス自体は、Runnableインタフェースと呼ばれているので、java.lang.Threadのインスタンスクラスはスレッドがあるが、それはjava.lang.Runnableのインターフェイスを実行するために呼び出す必要がありますスレッドを達成するためのrun()メソッドをオーバーライドする、Runnableインタフェース。

4、Javaは揮発性および同期アクションとの違いをキーワード?

揮発性

これは、変数は、メインメモリに直接アクセスコピーを保持しません変更します。
Javaメモリー・モデルでは、メインメモリがあり、各スレッドは、(例えば、レジスタ)それ自体のメモリを有します。パフォーマンスのために、スレッドは自分でメモリにアクセスする変数のコピーを保持します。そのような瞬間に、他のスレッドと同じ変数の可能な値のメモリ内のスレッドの値は、メモリ又は一貫性のない値の場合には、メインメモリに表示されます。揮発性として宣言された変数は、この変数はいつでも他のスレッドに変更することが予想されることを意味するので、スレッドのキャッシュメモリであることができません。

同期

最大1つのスレッドが同じ期間内のコードを実行していることを保証するために、使用、またはタイムコードブロックを修正する方法である場合。

  • まず、2つの同時スレッドで同じ対象物がこの同期化(この)同期ブロックにアクセスするときに、時間だけスレッドが実装されます。別のスレッドがコードブロックの実装が完了した後に、コードブロックを実行するために、現在のスレッドを待たなければなりません。
  • 2.しかし、スレッドが同期(本)同期ブロックのオブジェクトにアクセスするときに、別のスレッドが依然として非同期(本)同期ブロック内のオブジェクトにアクセスすることができます。
  • 第三には、スレッドが同期(本)同期ブロックのオブジェクトにアクセスするときに特に重要であり、同期コード・ブロックにアクセスするための同期、他のすべてのスレッド(この)の別の目的は、ブロックされます。
  • スレッドが同期(本)シンクブロックのオブジェクトにアクセスするときに第四に、それが得られるオブジェクトロックのオブジェクト。結果として、オブジェクトの同期コードセクションのすべてのオブジェクトにアクセスするための他のスレッドが一時的にブロックされています。
  • 第五に、上記の規則は、他のオブジェクトのロックにも同様に適用されます。

5.ライフサイクルの異なるスレッドは何ですか?

私たちは、Javaプログラムで新しいスレッドを作成すると、そのステータスは新しいです。我々は、スレッドのstart()メソッドを呼び出すと、ステータスはRunnableをに変更されます。スレッドスケジューラは、スレッドプール内のCPU時間のRunnableスレッドを割り当て、その状態が実行中に変更され伝えます。他のスレッドの状態待つ、ブロックされたとデッドがあります。

6.スレッドの優先度のご理解とは何ですか?

各スレッドは、実行時に優先順位、一般に、高い優先順位のスレッドを持つ優先度を有するが、これは、スレッドスケジューリングの実装に依存し、この実装は(OSに依存する)に依存するオペレーティングシステムです。私たちは、スレッドの優先順位を定義することができますが、これは、優先度の高いスレッドが優先順位の低いスレッドの前に実行されます保証するものではありません。スレッドの優先順位は、1が最低の優先順位であり、10が最優先である(1-10)からint型の変数です。

7.デッドロック(デッドロック)とは何ですか?どのように分析し、デッドロックを回避するには?

デッドロックは永遠にブロックし、このような状況は、2つのスレッドとリソースをより少なくとも二つ以上を生成する必要が二つ以上のスレッドの場合を指します。
デッドロックの分析、我々はスレッドダンプJavaアプリケーションを参照してくださいする必要があります。私たちは、スレッドと、彼らが待っているリソースのそれらBLOCKED状態を見つける必要があります。各リソースには、一意のIDを持って、我々は独自のオブジェクトロックを持つスレッドを見つけることができますIDを使用します。
、ネストされたロックを避けるために必要な場合にのみロックし、無期限に待機して避けることは、デッドロックを回避するための通常の方法です。

8.スレッドセーフとは何ですか?ベクターは、スレッドセーフなクラスが行うのですか?

プロセスが同時に実行されている複数のスレッドを持っており、これらのスレッドが同時にこのコードを実行することができ、あなたのコードの場合。それぞれの結果はシングルスレッド業績と同じ、また、他の変数の値を実行し、期待が同じである場合、それは、スレッドセーフです。スレッドセーフなカウンタオブジェクトクラスの同じインスタンスしません複数のスレッドを使用する場合に計算間違い。もちろん、あなたは二つのグループ、スレッドセーフと非スレッドセーフにコレクションクラスをすることができます。ベクターは、スレッドセーフ達成するための方法を同期しているが、これと同様のArrayListのはスレッドセーフではありません。

9、どのようにJavaでスレッドを停止するには?

Java APIは、非常に豊富に提供していますが、スレッドを停止するためのAPIを提供していませんでした。JDK 1.0は、停止()、(一時停止)と)(コントロールの方法を再開しますが、ためのJava APIの設計後の潜在的な脅威、したがって、彼らが放棄されているJDKの後続バージョンでデッドロックの提供しないようなものだっただろうスレッドを停止するために互換性があり、スレッドセーフな方法。手動でスレッドを終了させたい場合は、実行()、または完成し実行するための呼び出し()メソッドは、あなたがスレッドを中断し、リサイクルのrun()メソッドを終了するか、またはタスクをキャンセルするために揮発性のブール変数を使用することができたときにスレッドが自動的に終了します

10. ThreadLocalのは何ですか?

ThreadLocalのスレッドがローカル変数を作成するために使用され、我々はすべてのスレッドのオブジェクトは、そのグローバル変数を共有することを知って、これらの変数は、スレッドセーフではありません、私たちは、シンクロナス・テクノロジを使用することができます。私たちは同期を使用しない場合でも、我々はThreadLocal変数を選択することができます。
各スレッドは、独自のスレッド変数を持って、彼らは彼らの雌ねじの値にそのデフォルト値や変更を取得するには、Get()セット()メソッドを使用することができます。彼らは通常、スレッド状態に関連付けるThreadLocalのインスタンスは、プライベート静的プロパティです。

11.スリープ(の違い)、)((一時停止)と待つとは何ですか?

Thread.sleep()指定した時刻に「非動作」(実行不可能)状態で、現在のスレッド。スレッドがオブジェクトのモニターを開催してきました。この例では、スレッドまたはシンクブロック同期方法は、他のスレッドがブロックまたはメソッドに入ることができません。別のスレッドの呼び出しは()メソッドを中断した場合、それは「眠っている」スレッドを呼び起こします。
注意:スリープ()は静的メソッドです。これは、現在のスレッドがアクティブな場合にのみ、よくある間違いは、(Tここでは現在のスレッドと異なるスレッドである)、()t.sleep呼び出すことであることを意味します。でも実行t.sleep()、代わりトンのスレッドの、現在のスレッドがスリープ状態になるです。t.suspend()メソッドは廃止され、簡単にデッドロックにつながる)(、スレッドは常に一時停止、オブジェクトのモニターを開催します()停止を入力するためのスレッドを起こし中断使用しています。
Object.wait()「非動作」状態、およびスリープ()メソッドのために、現在のスレッドが異なる場合は、代わりに、スレッドの待機対象です。あなたははObject.wait()を呼び出すと、スレッドは、最初のオブジェクトをロックするオブジェクトを取得する必要があり、現在のスレッドがロックオブジェクトで同期させる必要があり、キューで待機するために、現在のスレッドを追加し、その後、別のスレッドがオブジェクトを呼び出すために、同じオブジェクトのロックに同期させることができます。 ()を通知し、これは、元の待機中のスレッドを目覚めさせ、その後、ロックを解除します。実質的に待つ()/通知()およびスリープ()/割り込みは、()は、オブジェクトのロックを取得する必要があることを除いて同様です。

12.スレッド不足は何ですか、ライブロックは何ですか?

場合は、すべてのスレッドがブロックされた、または無効なリソース要件に起因すると処理できない、非ブロッキングスレッドがリソースを利用可能にするために存在していないされています。のにJavaAPIスレッドライブロックは、以下の状況で発生する可能性があります。
実行のすべてのスレッドは、はObject.wait(0)プログラムでは、パラメータは、待機方法、0である場合。スレッドは、対応するオブジェクト()またはObject.notifyAll()にObject.notifyを呼び出すまでのプログラムは、ライブロックを送信します。
すべてのスレッドが無限ループでスタックした場合。

13. JavaのTimerクラスとは何ですか?タスク特定の時間間隔を作成する方法?

java.util.Timerは、将来の特定の時点でのスレッドの実行を手配するために使用できるユーティリティクラスです。Timerクラスは、1回限りのタスクまたは定期的なタスクをスケジュールすることができます。
java.util.TimerTaskは、抽象クラスは、Runnableインタフェースを実装している、我々は我々自身のタイミングを作成し、その実行を手配するためにタイマータスクを使用するには、このクラスを拡張する必要があります。

14、Javaでの同期と同時コレクションのセットは、違いは何ですか?

並行コレクションは、マルチスレッドと並行処理のセットが、しかし、高いスケーラビリティの集合によって複雑にスレッドセーフなのに適したセットを提供同期されます。
Java1.5のプログラマが使うとする前に、マルチスレッド同時実行時における同期の唯一のセットは、システムの拡張を妨げ、競合を引き起こす可能性があります。
Java5は、スケーラビリティを向上させるために分離し、内部のパーティションや他の近代的な技術をロックし、スレッドの安全性を提供するだけでなく、ConcurrentHashMapのような同時のコレクションを発表しました。

15、同期方法とより良い選択である同期ブロック、?

それは(もちろんあなたはそれがオブジェクト全体をロックすることができます)オブジェクト全体をロックしていないため、同期ブロックは、より良い選択です。同期方法は、多くの場合、実行を停止すると、このオブジェクトのロックを取得するのを待つためにそれらをリードしており、このクラスが関連付けられていない複数のシンクブロックを持っている場合でも、オブジェクト全体をロックします。

16、スレッドプールは何ですか?なぜそれを使うのか?

タスクは、応答時間が長くなりますので、スレッドを作成することで、プロセスが作成できるスレッドの数が限られている場合、スレッド高価なリソースと時間を作成します。
プログラムは、治療に反応して作成した複数のスレッドを起動したとき、これらの問題を回避するために、彼らは、スレッドはワーカースレッドと呼ばれるスレッドプールを、と呼ばれています。
当初JDK1.5から、Java APIは、エグゼキュータのフレームワークを使用すると、別のスレッドプールを作成することができます提供します。スレッドプールスレッドプールの固定数、又は(はるかに短い生存タスクプログラムスケーラブルなスレッドプールの)キャッシュ、例えば、単一スレッドプール、各タスクを扱います。

17、invokeAndWaitの中にJavaとinvokeLater違いは何ですか?

これらの2つの方法ではなく、イベントの現在のスレッドからGUIコンポーネントで更新スレッドをディスパッチするための開発者に使用可能なJavaのSwing APIです。invokeAndWaitの()は、プログレスバーなどの同期更新GUIコンポーネントは、一度更新を進行、プログレスバーが適切な変更を行うべきです。進捗が複数のスレッドによって追跡される場合、それに応じて更新されたイベント・ディスパッチスレッドコンポーネントを要求するinvokeAndWaitの()メソッドを呼び出します。invokeLater()メソッドは非同期に更新されたコンポーネントと呼ばれています。

18、あなたはマルチスレッドのサイクルを何をしているしているの?

従来の方法とは異なり、待つスレッドを持つプログラマは(待つようにビジーサイクル)のサイクルで、スリープ()または収量()彼らは、CPUの制御をあきらめた、とCPUビジーサイクルはあきらめないだろう、それが空のサイクルを実行しています。目標は、CPUのキャッシュを保持することです。
待機中のスレッドが別のカーネルに目覚めるかもしれないマルチコアシステムは、実行されている場合は、キャッシュを再構築します。再構築のキャッシュを再構築するための待ち時間を回避し軽減するために、あなたはそれを使用することができます

強固な基盤と、Fanger魏コードに加えてJavaの学習技術交流グループの下に掃引するようこそ、自己価値を向上させます



おすすめ

転載: juejin.im/post/5d3bfb17f265da1ba77cebe2