ホームページ  >  記事  >  Java  >  2020 年の新しい Java 面接の質問 - マルチスレッド (4)

2020 年の新しい Java 面接の質問 - マルチスレッド (4)

王林
王林転載
2020-05-29 17:22:582177ブラウズ

2020 年の新しい Java 面接の質問 - マルチスレッド (4)

1. デッドロックを防ぐにはどうすればよいですか?

デッドロックに必要な 4 つの条件:

相互排他条件: プロセスは、割り当てられたリソースへの他のプロセスのアクセスを許可しません。他のプロセスがリソースにアクセスする場合は、待機することしかできません。リソースを占有しているプロセスは使用完了後にリソースを解放する

リクエストと保持条件:プロセスはあるリソースを獲得した後、他のリソースをリクエストしますが、そのリソースは他のプロセスによって占有される可能性があります。リクエストはブロックされますが、自身が取得したリソースは保持されます。

非剥奪条件: プロセスが取得したリソースを指します。使用が完了する前に剥奪することはできず、使用後にのみ解放できます。 .

ループ待機条件: プロセスでデッドロックが発生した後、複数のプロセス間で先頭から末尾までのループ待機リソース関係が形成されることを指します。

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

デッドロックの原因、特にデッドロックに必要な 4 つの条件を理解すると、デッドロックを可能な限り回避、防止、排除することができます。

したがって、システム設計、プロセスのスケジューリングなどの観点から、これら 4 つの必要条件が成立しないようにする方法、合理的なリソース割り当てアルゴリズムを決定する方法、およびプロセスがシステムを永続的に占有することを回避する方法に注意してください。リソース。

さらに、プロセスが待機状態にあるときにリソースを占有しないようにすることも必要です。したがって、リソースの割り当ては適切に計画する必要があります。

(ビデオ チュートリアルの推奨: java ビデオ )

2. ThreadLocal とは何ですか?どのような使用シナリオがありますか?

スレッドローカル変数は、スレッド自体に属し、複数のスレッド間で共有されない、スレッドに限定された変数です。 Java は、スレッド セーフを実現する方法であるスレッド ローカル変数をサポートする ThreadLocal クラスを提供します。ただし、ワーカー スレッドの有効期間がアプリケーション変数の有効期間よりも長い管理環境 (Web サーバーなど) でスレッド ローカル変数を使用する場合は特に注意してください。作業の完了後にスレッドローカル変数が解放されないと、Java アプリケーションはメモリ リークの危険にさらされます。

3. 同期の基本的な実装原理について教えてください。

Synchronized を使用すると、メソッドまたはコード ブロックの実行中に、同時にクリティカル セクションに入ることができるのは 1 つのメソッドだけであることが保証され、共有変数のメモリの可視性も保証されます。

Java のすべてのオブジェクトはロックとして使用でき、これが同期を実現するための synchronized の基礎となります:

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

静的同期メソッド、ロック 現在のクラスのクラスオブジェクトです

同期メソッドブロック、ロックは括弧内のオブジェクトです

4. 同期メソッドの違いは何ですかそして揮発性ですか?

volatile の本質は、レジスタ (作業メモリ) 内の現在の変数の値が不確実であり、メイン メモリから読み取る必要があることを jvm に伝えることです。同期ロックは現在の変数をロックし、現在のスレッドのみが実行できます。 この変数にアクセスすると、他のスレッドはブロックされます。

volatile は変数レベルでのみ使用でき、synchronized は変数、メソッド、クラス レベルで使用できます。

volatile は変数の変更の可視性のみを実現でき、アトミック性は保証できませんが、synchronized は変数の変更の可視性とアトミック性を保証できます。

Volatile ではスレッド ブロックが発生しませんが、synchronized ではスレッド ブロックが発生する可能性があります。

volatile とマークされた変数はコンパイラによって最適化されませんが、synchronized とマークされた変数はコンパイラによって最適化できます。

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

まず、synchronized は Java の組み込みキーワードです。JVM レベルでは、Lock は Java クラスです。

synchronized では、ロック状態が取得されているかどうかを判断できません。ただし、Lock はロックが取得されているかどうかを判断できます。

synchronized は自動的にロックを解放します (スレッドは同期コードの実行後にロックを解放します。スレッドは実行中に例外が発生した場合にロックを解放します)。Lock最終的に手動で解放する必要があります (unlock() メソッドがロックを解放します)。そうしないと、スレッドのデッドロックが簡単に発生します。

2 つのスレッド 1 と 2 に synchronized キーワードを使用します。現在のスレッド 1 の場合、ロックを取得すると、スレッド 2 は待機します。スレッド 1 がブロックされている場合、スレッド 2 は永久に待機し、Lock ロックは必ずしも待機する必要はありません。ロックを取得できない場合、スレッドは待機せずに終了できます。

同期ロックは繰り返すことができます。入力可能、中断不可、 Lock は再入可能で、判断可能で、公平です (両方が可能です)。

Lock ロックは大量の同期コードによる同期の問題に適しており、同期ロックは少量のコードに適しています。 . 同期の問題。

(関連チュートリアルの推奨事項: Java 開発入門 )

6. synchronized と ReentrantLock の違いは何ですか?

synchronized は if、else、for、while と同じキーワードであり、ReentrantLock はクラスです。これが 2 つの本質的な違いです。 ReentrantLock はクラスであるため、synchronized よりもさらに柔軟な機能が提供されます。継承でき、メソッドを持つことができ、さまざまなクラス変数を持つことができます。synchronized と比較した ReentrantLock のスケーラビリティは、いくつかの点に反映されています:

ReentrantLock はロック取得の待ち時間を設定できるため、デッドロックを回避できます

ReentrantLock はさまざまなロックに関する情報を取得できます

ReentrantLock は複数の通知を柔軟に実装できます

さらに、ロックこの 2 つのメカニズムは実際には異なります。ReentrantLock は Unsafe park メソッドを呼び出して下部をロックしますが、synchronized はオブジェクト ヘッダー内のマーク ワードを操作する必要があります。

7. 原子の原理について教えてください。

Atomic パッケージのクラスの基本的な特徴は、マルチスレッド環境で、複数のスレッドが 1 つの変数 (基本型と参照型を含む) を同時に操作するときに、つまり、複数のスレッドがこの変数の値を同時に更新すると、1 つのスレッドのみが成功し、失敗したスレッドは実行が成功するまでスピン ロックのように試行を続けることができます。

Atomic シリーズのクラスのコア メソッドは、安全でないクラスのいくつかのローカル メソッドを呼び出します。最初に知っておく必要があるのは、Unsafe クラスです。そのフルネームは sun.misc.Unsafe です。このクラスには、多くの直接メモリ割り当てやアトミック操作の呼び出しなど、C コードに対する多数の操作が含まれています。は非安全としてマークされていますが、この中の多数のメソッド呼び出しにはセキュリティ上のリスクがあり、注意して使用する必要があり、そうでないと深刻な結果につながる可能性があることをお伝えします。特定の領域を指定すると、C のような結果になる可能性があります。ポインタが他のプロセスへの境界を越えます。

推奨チュートリアル: Java 面接の質問

以上が2020 年の新しい Java 面接の質問 - マルチスレッド (4)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。