並行プログラミング(Javaインタビューの質問)

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

プロセスはリソース割り当ての最小単位、スレッドはCPUスケジューリングの最小単位、プロセスには複数のスレッドが含まれます

2、スレッドのライフサイクルについて話す

スレッドには、作成、待機、実行、ブロック、終了の5つの状態があります。スレッドを作成するには3つの方法があります。2つには戻り値がない、1つには戻り値がある、1つ目はThreadクラスを継承する、2つ目はRunnableインターフェースを実装する、 3番目は、CallableおよびFutureによって作成され(CallableクラスのCallメソッドをオーバーライドし、getメソッドを介してCallの戻り値を取得します)、スレッドが作成された後、スレッドがCPUによってスケジュールされているときに、startメソッドを呼び出すことによってスレッドは待機状態になります実行状態に入ります。スレッドがスリープメソッドまたは待機メソッドを呼び出してブロッキング状態に入る場合。次に、interruptメソッドinterruptを使用して例外をスローし、スリープ状態のスレッドをウェイクアップするか、notifyおよびnotifyAllを使用して待機スレッドをウェイクアップし、オブジェクトロックプールに入ります。スレッドが終了する状況は3つあります。1つ目はrunメソッドの終了、2つ目はstopメソッドを呼び出して強制終了、3つ目はinterruptメソッドの割り込みを使用してスレッドを適切な場所で終了することです。

3.待機()とスリープ()の5つの違いは何ですか?

5つの違いがあります。1つ目は、スリープはCPUリソースをあきらめない、待機する、2つ目は、スリープがロックを解放しない、待機する、3つ目は、任意の場所でスリープを呼び出すことができる、待機メソッドのみが同期できることです4つ目は、ブロックまたは同期メソッドで呼び出され、スリープからのウェイクアップ後に待機状態に入り、ウェイクアップ後にオブジェクトのロックプール内のロックを競合します。5番目の違いは、sleepメソッドがスレッドメソッドであり、waitがObjectメソッドであることです。

4.待機()、通知()、通知すべて()の違いは何ですか?

メソッドのリリースにロックを待ってCPUリソースを聞かせて、ランダムなオブジェクトロックにスレッドプールをウェイク通知するスレッドは、プールオブジェクトのロックを覚ますのnotifyAll
(ロックへといくつかのスレッド、より大きな優先度の高いスレッドスクランブルの確率setPriority()1は最低の優先度、10は最高の優先度、デフォルト値は5
、thread.setPriority(1))

5.揮発性物質の役割は何ですか?

、スレッド間の視認性を確保再配置命令を防ぐためではなく、メインメモリ(共有スレッド領域)から直接読み取る場合、それぞれが修飾変数を読み取る
ワーキングメモリ(スレッドプライベート領域、スタック)から読み出しフェッチ。スレッドが常に最新の値が読み取られるようにします。ただし、Volatileで保証できるの
はスレッド間の可視性のみで、原子性は保証されません。2つのスレッドが変数を同時に作業メモリにコピーし、変更後にそれらをメインメモリにコピー
すると、問題が発生します。上記のように、作業メモリへの読み取りは、実際にはコピーされる作業キャッシュ領域です。作業キャッシュ領域は抽象的な概念です
。jvmでこの領域の分割はありません。特定の配置は仮想マシンによって決定されます。 JMM仕様に準拠している限り。

6.揮発性の適用シナリオ?

スレッドの安全性を保証する必要はありません。たとえば、runメソッドにはスイッチとしてVolatileによって変更された変数があり、スイッチがfalseの場合、ループを終了します。

7.揮発性と同期の3つの違いは何ですか?

1つ目は、volatileは軽量同期(排他的ではなく、アトミック性は保証されない)、重い同期(排他的、CPUスイッチングはリソースを消費する)です。2つ目は、volatileはアトミック性を保証しないのに対し、同期化はアトミック性を保証することです。可視性を確保するために、3番目はvolatileは変数のみを変更でき、同期はコードブロックとメソッドを変更できる

8.デッドロックはいつ発生しますか?デッドロックを回避するには?

デッドロックには4つの条件があります。相互排除、非プリエンプション、要求と保持、ループ待機です。デッドロックを回避する方法は2つあります。1つはロックの順序が一貫していること、もう1つはロックのタイムアウトを設定することです。

9.ロックのタイムアウトを設定するにはどうすればよいですか?

10.プロデューサーとコンシューマーの問題を実現するためのコードの使用方法

リソースクラスを作成し、リソースの最大数を10に設定します。現在のリソース数は0です。クラスにはremoveメソッドとputメソッドがあり、removeメソッドは現在のリソース数が0かどうかを判別し、waitメソッドを呼び出して0を待機します。ゼロ以外のリソース–最後に、notifyを使用して他のスレッドをウェイクアップします(notifyallでウェイクアップするのはなぜですか?1つのウェイクアップもランダムなので、すべてのウェイクアップもロックのランダム競合です。もちろん、数値が小さいほど、リソース消費は少なくなります)同様に、リソースが最大値に達したかどうかを判断するには、リソースが最大値に達した場合は待機し、そうでない場合はリソース++を待機し、最後に他のスレッドを起動します。コンシューマークラスとプロデューサークラスは組み合わせを使用して、リソースクラスのremoveメソッドとputメソッドを呼び出し、それぞれコンシューマープロデューサースレッドを作成および開始します。

11. Synchronizedの実現原理は?

jdk1.6以前は、同期は重いですが、継続的な最適化の後、jdk1.6以降は非常に強力になります。同期ロックには、ロックなし、バイアスロック、軽量ロック、および重量ロックの4つの状態があります。競争状態は徐々にアップグレードされるため、ダウングレードすることはできません。ロックが初めて取得されると、オブジェクトヘッダーのマークワードのロック情報がCASを通じて変更されます。ロックはCASからバイアスロックにアップグレードされます。マークワードはスレッドのIDを記録します。他のスレッドとの競合がなければ、CASを介してロックおよびロック解除する必要はなく、バイアスされたスレッドは常にバイアスされたロックを持ちます。スレッドが偏ったロックを求めて競合しようとすると、ロックのキャンセルが発生します。偏ったロックを保持しているスレッドが同期コードブロックを終了したか、アクティブでない場合、偏ったロックを保持しているスレッドは一時的に安全な場所に置かれ、その後解放されます。バイアスされたロックを保持しているスレッドをロックしてからウェイクアップします(割り込み?)。競合するスレッドは、CASを通じてマークワードのバイアスされたスレッドIDを変更して、バイアスされたロックを取得します。競合が発生し、バイアスロックを保持しているスレッドが同期コードブロックを終了しない場合、バイアスロックは軽量ロックにアップグレードされ、JVMはバイアススレッドのスタックにロック情報を格納するためのスペースを開き、MarkWordのコピーをオブジェクトヘッダーに格納します。オブジェクトヘッダーのMarkWordは、スタック内のロック情報へのポインターに置き換えられます。軽量ロックが解放されると
、MarkWordは再びオブジェクトヘッドに置き換えられ、最初にバイアスロックを保持していたスレッドが呼び起こされます。競合するスレッドは、MarkWordをスタック内の情報へのポインタで置き換えようとします。置き換えが成功すると、軽量ロックが取得されます。置き換えが失敗すると、スピンは失敗し、スピンの数は重量ロックにアップグレードされます。モニターの重量ロックは、monitorenterに基づいていますmonitorexit命令が実装され、monitorenterが開始位置に挿入され、monitorexitが終了位置に挿入されます。JVMは、各monitorenterにmonitorexitが関連付けられ、各オブジェクトにモニターが関連付けられていることを確認する必要があります。モニターが保持されている場合、オブジェクトはロックされます。スレッドは、monitorenter命令を実行すると、オブジェクトロックに対応するモニターの所有権を取得しようとします。つまり、オブジェクトロックを取得しようとします。

12.このロック、オブジェクトロック、クラスロックの違いは何ですか?

このロックは現在のインスタンスをロックし、オブジェクトロックは指定されたオブジェクトをロックし、クラスロックはクラスオブジェクトをロックします。同期は、通常のメソッドを変更するときにこのロックです。User.class.wait()はロックを解放し、静的メソッドを変更しますクラスロックです。コードブロックを装飾するときにロックのタイプを指定できます。本質はモニターを使用することです

13.ロックの一般的なタイプは何ですか?

CASロック:3つの基本的なオペランドがASメカニズムで使用されます:メモリアドレスV、古い期待値A、および変更される新しい値B。変数を更新する場合、変数の期待値AとメモリアドレスVの実際の値が同じである場合にのみ、メモリアドレスVに対応する値がBに変更されます。スピンロック:ロック条件が満たされているかどうかを継続的に判断するのはCASです。楽観的ロック:最初から、実行は成功すると考えられており、バージョン番号またはタイムスタンプによって制御されます。CASは楽観的ロックです。悲観的ロック:当初、ロックは正常に実行されないと考えられていたため、ロックの競合の後にビジネスロジックが実行されました。再入可能ロック:外側の層がロックを取得した後、デッドロックを回避するために内側の層が再度ロックを取得する必要はありません。非再入可能ロック:外側の層がロックを取得した後、内側の層もロックを再取得する必要があり、デッドロックが発生しやすくなります。公平なロック:異なる期間にオブジェクトロックプールに入る人は、先着順ロックのルールに従ってロックを取得します。不当なロック:異なる期間にオブジェクトロックプールに入る
ユーザーは、ロックの競合ルールに従ってバイアスを取得します(バイアスロック、軽量ロック、および重量ロック)。セグメントロック:ConcrrountHashMapについて説明します。分散ロック:Redis、ZKなど 読み取り/書き込みロック:書き込み時に他の読み取りと書き込みを許可しないでください。サービスはzkと同期するときに理由を許可しません。

14. ReetranLockとSynchronizedの3つの違いについて話してください。

ReentrantLockは、Lockインターフェイスのすべての操作をSyncクラスに委任します。SyncクラスはAQS抽象クラスを継承します。Syncには2つのサブクラスがあり、1つはフェアロックを
サポートしもう1つはアンフェアロックをサポートします。不当なロックがデフォルトで使用されます。ReentrantLock.lockはNonFairSync.lockメソッドを呼び出します(AQSは
、サブクラスにロックを取得しようとするメソッドを渡して、ロックが取得されているかどうかを確認するために、lock unlock holdLock()を実装します。

15. ReetranLockとSynchronizedの4つの違いは?

1つ目の違い:1つはクラス、1つはキーワード、2つ目の違い:ロックが取得されたかどうかを判断できる、1つは取得されない、3つ目の違い:1つは自動変速機(開始位置と終了位置の指定)、1つそれは手動ブロック(装飾方法とコードブロック)
です。4番目の違い:ロックは楽観的ロックです。同期は元々悲観的ロックを使用しました。jdk1.6以降は非常に強力になり、アップグレードできます。

16. join()の役割

スレッドの実行順序を保証するために一般的に使用されるブロッキングスレッド

17. run()とstart()の違いは何ですか?

run()は単純なメソッドであり、スレッドを作成しません。startメソッドは、スレッドの作成後にrunメソッドを実行します

18. CycliBarriarとCountdownLatchの違いは何ですか?

最初の違いは、フォーカスが異なることです。CycliBarriarは通常、特定の状態が実行されるまでスレッドのグループをブロックするために使用されます。CountdownLatchは
、実行前に他のスレッドがタスクを完了するまでスレッドを待機させます。2番目の違いは、CycliBarriarをリサイクルできることです。 CountdownLatchは1回限りで、0の前にスレッドをブロックします

19.マルチスレッド環境での一般的な問題は?

競合状態:スレッドセーフではないデータを同時に操作し、予期しない結果が発生する
デッドロック:リソースを相互に取得する
Livelock:リソースを相互に渡し、解決し、先着順の
ハンガー:リソースが不十分

20.アトムとは何ですか?

たとえば、AtomicIntegerクラスは、スレッドの安全性を確保するためにインクリメントまたはデクリメントするメソッドを呼び出すことができます

21. CASロックとは何ですか?

CASには3つのオペランド、メモリ値V、古い期待値A、および変更する新しい値Bがあります。期待値Aとメモリ値Vが同じ場合に限り、メモリ値VをBに変更します。それ以外の場合はVを返します。
これは、それが変わる前に、私はそれを信じて、それを修正するために、他のスレッド思考の楽観的ロックではありません。そして同期は悲観的ロックです、それは変わる前に、考えて
、悲観的ロック、それを修正するために他のスレッドがあるでしょう効率は非常に低いです。
CASには非常に明らかな問題、つまりABAの問題があります。
最初に読み取られたときに変数VがAであり、割り当ての準備中に変数VがまだAであることが確認された場合、その値が他のスレッドによって変更されていないことを示している可能性があります。そうですか?
この時間内にBに変更された後、Aに戻された場合、CAS操作は誤動作し、変更されたことはありません。この状況に対応して、Javaコンカレントパッケージは
、マークされたアトミックアプリケーションクラスAtomicStampedRefernceを提供します。これにより、変数値のバージョンを通じてCASの正確さが保証されます。

22.アプリケーション層の一般的なロックは何ですか?

同期锁、ロック

23.悲観的ロックの適用シナリオ?

同時実行の量が多い場合、応答が速い場合は楽観的ロックが使用され、応答が成功するか失敗する場合があります。再試行コストが高い場合は
、成功率を保証できる悲観的ロックを使用します
悲観的ロックは読み取りと書き込みが多い場合に適しています。楽観的ロックは読み取りと書き込みが少ない場合に適しています。

24. IOデッドロックはどうなりますか?

25. IOデッドロックの問題であり、他の問題ではないかどうかをすばやく判断するにはどうすればよいですか?

26. CLHは知っていますか?仮想キュー。

仮想キューは実際のキューではありませんが、ポインタは次のノードを指します。これはキューのように見えます

27.なぜダブルチェックロックには揮発性が必要なのですか?

28.マルチスレッドによって効率が向上するのはなぜですか?

29.新しいスレッドを無期限に開いた場合、このプログラムの効率は上昇し続けるのか、それとも低下するのか、それとも変更されないままなのか?

30. Synchronizedは、同時実行の問題を処理する単一のサーバーですが、複数のサーバーはどうですか?

31.同期コードブロックで待機()、通知()、通知すべて()を呼び出す必要がある理由

32. Java仮想マシンによる同期の最適化

Synchronizedは1.6より前のヘビーウェイトロックであり、バイアスロック、ライトウェイトロック、アダプティブスピンロックが1.6より後に導入されました

33. 2つのスレッド間でデータを共有する方法


メソッドでグローバル静的変数を渡す参照を作成する

34.待機を正しく使用するには?もしかそれとも?

whileを使用するか、それ以外の場合は最初に待機する
必要があります。目を覚ました後、次のプロセスに直接進みます。条件が満たされているかどうかを判断してから下に行く必要があります

35.なぜマルチスレッドを使用するのですか?マルチスレッドアプリケーションのシナリオ?

マルチスレッド化により、CPU使用率を向上させることができます。たとえば、登録中にテキストメッセージを送信する場合、
ビジネスロジックの処理中にテキストメッセージを送信できます。また、複数のファイルのアップロードとログを非同期にesに書き込むaopもあります。

36.デッドロックを検出するには?

jstackはデッドロックされた場所を示すことができ、jvmにはツールが付属しています

37.マルチスレッドで実行()メソッドが1つだけ実行されるようにするにはどうすればよいですか?(*******)

38.ブロッキングキューとは何ですか?それを達成する方法は?

生産者と消費者の問題

39. ThreadLocalとは何ですか?役割は何ですか?(*******)

40.同期と非同期の違い

同期:ユーザーに返される前にすべての操作が完了します。例:銀行振込
非同期:すべての操作が完了するのを待つ必要はなく、結果を返して部分的な更新を行います。

51件の元の記事を公開 Likes2 1850を訪問

おすすめ

転載: blog.csdn.net/qq_42972645/article/details/105658158