1. スレッドの同期と非同期とは何ですか?
(その他のインタビュー質問の推奨事項:java インタビューの質問)
同期 (同期) は調整されたペースで、あらかじめ決められた順序で実行されます。
非同期は同期の逆で、ブロックせずに同時に実行されます。
2. 安全でないスレッドとは何ですか?の解き方? (重要なポイント)
スレッド セーフとは何ですか?
コードが配置されているプロセスで複数のスレッドが同時に実行されている場合、これらのスレッドがこのコードを同時に実行する可能性があります。各実行の結果がシングルスレッド実行の結果と同じであり、他の変数の値が予想どおり同じである場合、それはスレッドセーフです。
言い換えると、クラスまたはプログラムによって提供されるインターフェイスは、スレッドのアトミックな操作であるか、複数のスレッド間の切り替えによってインターフェイスの実行結果があいまいになることはありません。つまり、次のことを考慮する必要はありません。同期の問題。
スレッドの安全性の問題は、グローバル変数と静的変数によって引き起こされます。
各スレッドのグローバル変数と静的変数に対して読み取り操作のみが行われ、書き込み操作がない場合、一般的に、このグローバル変数はスレッドセーフです。複数のスレッドが同時に書き込み操作を実行する場合、通常、スレッド同期を考慮する必要があります。そうしないと、スレッドの安全性が影響を受ける可能性があります。
(関連チュートリアルの推奨事項:Java 入門プログラム)
ArrayList スレッドが安全でないのはなぜですか?安全でないのになぜ使用するのでしょうか?スレッドの安全性の問題を解決するにはどうすればよいですか?
ArrayList で要素を追加するときは、次の 2 つの手順で完了できます:
1. Items[Size] の場所に要素を保存します;
2 . サイズの値を増やします。
シングルスレッド操作の場合、サイズ = 0 の場合、要素を追加した後、要素は位置 0、サイズ = 1 になります。また、マルチスレッドの場合、たとえば、 2 つのスレッドがある場合、スレッド A は最初に要素を位置 0 に格納します。
しかし、この時点では、CPU はスレッド A を一時停止するようにスケジュールし、スレッド B には実行の機会が与えられます。この時点では Size がまだ 0 に等しいため、スレッド B もこの ArrayList に要素を追加します (要素の追加には 2 つのステップが必要であり、スレッド A はステップ 1 のみを完了していると想定していることに注意してください)。そのため、スレッド B は要素も Stored at に追加します。場所0。その後、スレッド A とスレッド B の両方が実行を継続し、どちらも Size の値を増加させます。
さて、ArrayList の状況を見てみましょう。実際には要素は 1 つだけあり、位置 0 に格納されていますが、Size は 2 に等しいです。これは「スレッドが安全ではありません」です。 ######の解き方?
ロック (オブジェクト ロック、ロック コード ブロック)、スピン CAS メソッド (オプティミスティック ロック)、java が提供するスレッドセーフ データ クラスを使用します
3. スレッドの作成方法?方法は何通りありますか?1. Thread クラスを継承します
2. Runnable インターフェイスを実装します
3. Callable インターフェイスを実装します
4. Runnalbeを使用してください。インターフェイスは優れていますか?それともThreadクラスを継承した方が良いのでしょうか?Runnable インターフェイスを実装することをお勧めします。
1. Runnable インターフェイスを実装すると、Java 単一継承の制限を回避できるためです。
クラスが Thread を継承する場合、他のクラスを継承することはできません。また、クラスが Runnable を実装すると、他のクラスから継承することもできます。
2. オブジェクト指向設計との整合性を高める
run() メソッドは、スレッドによって実行されるコードをカプセル化するために使用されます。この場合、run() メソッドが属するオブジェクトはスレッド タスク オブジェクトです。 Thread クラスのサブクラス オブジェクトは、スレッド オブジェクトとスレッド タスク オブジェクトの両方です。カップリングは非常に強いです。
Runnable インターフェイスを使用すると、スレッド タスクとスレッドを分離でき、プログラムのスケーラビリティが向上します。
(推奨される関連ビデオ チュートリアル:
java ビデオ チュートリアル 5. sleep() と wait() の違いは何ですか?sleep はスレッド クラス (Thread) のメソッドで、このスレッドは指定された時間実行を一時停止し、他のスレッドに実行の機会を与えますが、監視ステータスは維持され、時間が経過すると自動的に再開されます。起きています。 sleep を呼び出してもオブジェクトのロックは解除されません。
wait は、Object クラスのメソッドです。このオブジェクトの wait メソッドを呼び出すと、このスレッドはオブジェクト ロックを放棄し、このオブジェクトを待機する待機ロック プールに入ります。notify メソッド (または、notifyAll) の後にのみ、 ) がこのオブジェクトに対して発行されると、このスレッドはオブジェクト ロック プールに入り、オブジェクト ロックを取得して実行状態に入る準備をすることができます。
変数が volatile として宣言されている場合、アクセスされるたびにメイン メモリとの一貫性が保たれます。変数が同期メソッドまたは同期ブロックでアクセスされる場合は、変数の入り口でロックが取得されたときに、メソッドまたはブロックとメソッドまたはブロック 変数は、終了時にロックが解放されると同期されます。
以上がJava の古典的な面接質問集 (5)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。