2020レビュー仕上げ - マルチスレッド

1.マルチスレッドの役割

1)マルチコアCPUを利用する
シングルコアCPUにいわゆる偽のマルチスレッド化され、プロセッサにのみ複数のスレッドのように見える、高速スレッドの切り替えよりも論理の同じ期間に対処する、しかしすることを「マルチスレッド」 「同時に」ベールを実行します。マルチコアCPU上でマルチスレッドは、真のマルチスレッド化され、それはあなたが、同じ論理マルチセグメントで動作することができ、マルチスレッド、実際にCPUをフルに活用の目的を達成するために、マルチコアCPUの利点を再生することができます。
2)閉塞防止
のモデリング容易にするために、3)
このマルチスレッドすることも利点です。あなたが大規模なタスクA、シングルスレッドプログラミングを持っていると仮定し、その後、あなたがプログラム全体のモデルがあまりにも面倒で構築し、多くのことを考慮する必要があります。しかし、多くの単純な、その後、いくつかの小さなタスクに分け、この偉大なタスクA、タスクB、タスクC、タスクDあれば、プログラムのモデルを確立し、それぞれ、マルチスレッドを介してこれらのタスクを実行します。

2、スレッドの方法を作成

:二つの方法で、一般的である
Threadクラスを継承1)
2)Runnableを実装
ために継承するインタフェースクラスの実装の仕方がより方法よりも後者は、確かに良いことは言うまでもないです柔軟- また、プログラム間で削減カップリング指向プログラミング・インターフェースでもある
基本原則の6つのモデルを設計しました。

区別3、start()メソッドとrun()メソッド

start()メソッドのみを呼び出し、内部交互に行うマルチスレッド実行異なるスレッド()メソッドコードの特性を示すであろう。あなただけのrun()メソッドを呼び出した場合、コードは同期的に実行され、すべての内部のコードが終了した後に、別のスレッドがそのrun()メソッドのコードの内部を実行できるスレッドのrun()メソッドを待たなければなりません。

4、呼び出し可能のRunnableインターフェースとインターフェースとの間の差

run()メソッドの戻り値で、Runnableインタフェースは、ちょうどのみrun()メソッドのコードを実行するために、純粋にそれを行う、無効となり、コール呼び出し可能インターフェース()メソッドの戻り値は、それが一般的なもので・未来、FutureTaskフィットは、非同期実行の結果を得るために使用することができます。
シングルスレッドのマルチスレッドに比べてより困難、より重要な理由があるため、これは、未知のセックスの完全な複雑なマルチスレッド、特定のスレッドかどうか、有用な機能ですか?いくつかのスレッドがどのくらい実行しますか?特定のスレッドは、我々はデータを期待譲渡の実行が完了したときかどうか?知らない、私たちは、このマルチスレッドのタスクがそれを完了するまで待機される行うことができます。スレッドは、ケースコーラブル+フューチャー/ FutureTaskで本当に有用であることがタスクをキャンセルができますが、複数のスレッドを実行した結果を得ることができ、あなたは必要なデータを取得するには、あまりにも長く待つことはできません。

FutureTaskは何ですか

FutureTaskは、タスク非同期操作を表します。タスク非同期処理の結果にアクセスするために待機させることができる、完成された呼び出し可能な実装クラスを渡すことができFutureTaskは、操作タスクをキャンセルするか否かが判断されます。もちろん、FutureTaskまた、Runnableインタフェースの実装クラスので、FutureTaskので、スレッドプールに配置することができます。

5、違いCyclicBarrierをして​​たCountDownLatch

たCountDownLatchは、CyclicBarrierをリサイクルされ、使い捨てで
関わったCountDownLatchスレッドがカウントダウン中にいくつかは、いくつかのカウントダウンの終了を待って、同じではありません義務を。スレッドの責任が同じである参加CyclicBarrierを。
参考CyclicBarrierを

6、volatileキーワードの役割

1)主に可視性と不可分の周りにマルチスレッド二つの性質は、修飾された揮発性キーワード変数の使用を拡大します複数のスレッド間での視認性を確保するために、volatile変数への各読みになること、それが最新のデータでなければなりません。
基礎となる実行私たちが見てきたように、その2)高レベル言語コード---- Javaプログラム簡単なので、アセンブリ言語> C / C ++コードにコンパイルされている - - C / C ++コードに対応するバイトコードの実行に係る> - >バイトコード - その実装は、Javaコードで>とハードウェアとの相互作用、実際には、より高いパフォーマンスJVMのかもしれないコマンドの並べ替えを得るために、複数のスレッドの下でいくつかの予期しない問題がある可能性があります。それはもちろん、コード実行の効率の程度を減少させなければなりません並べ替えの揮発性セマンティクスを使用することを、禁止します。

実用的な観点からは、重要な役割は、揮発性であり、CASは原子性を確保するために結合しました詳細は、カテゴリは、java.util.concurrent.atomicパッケージ、などのAtomicIntegerの下で見つけることができます。

7.スレッドセーフとは何ですか

あなたのコードは、マルチスレッドでスレッドセーフであるので、あなたのコードの実行と実行は、常に、シングルスレッドで同じ結果を得ることができる場合

いくつかのスレッドの安全性のレベルもあります。

1)不変

文字列、整数、ロングのように、これらは、クラスの最後の一種である、スレッドは、任意の同期手段なしにこれらの不変オブジェクトは、マルチスレッド環境で直接使用することができるので、新たに作成しない限り変更することが、それらの値を変更することはできません使用

2)絶対スレッドの安全性

かかわらず、ランタイム環境の、呼び出し側は、追加の同期化対策を必要としません。これを行うには通常追加費用がかかり、Javaが独自のスレッドセーフなクラスで述べたように、実際には大半がスレッドセーフではありませんが、絶対にスレッドセーフクラス、Javaはまた、CopyOnWriteArrayListと言う、CopyOnWriteArraySetを持っています

3)相対セキュリティ・スレッド

ベクトルトラバーススレッドがある場合は、このようなベクターとして、スレッドセーフの私たちの通常の意味、にしたときの相対セキュリティスレッド、追加、削除方法はアトミック操作であるが、唯一のこれまで中断されることはなくなります同時にスレッドがこのベクトルが追加され、フェイルファストメカニズムである例ConcurrentModificationExceptionが99%を、表示されます。

4)非スレッドセーフ

言うことはこれだけでは何も、ArrayListに、LinkedListは、HashMapのは、すべての非スレッドセーフなクラスではありません

8、Javaはどのようにスレッドダンプファイルを取得するには

無限ループ、デッドロック、ブロッキング、ページには、スレッドダンプは、問題を解決するための最良の方法です遊んで、スローやその他の問題を開きます。スレッドスタックを取得するために、スレッドダンプスレッドスタックと呼ばれていることの2つのステップがあります。

グレップJavaの| 1)PIDスレッドを取得するには、jpsコマンドは、Linux環境のps -efでも使用することができます使用することができます

2)印刷スレッドスタック、あなたはまた、キル-3 PIDを使用することができ、Linux環境でjstack pidのコマンドを使用することができます

Threadクラスは、getStackTraceメソッド()メソッドを提供し、さらに言及はまた、スレッドのスタックを得るために使用され得ます。これは、インスタンスメソッドであるため、この方法は、特異的かつ結合糸のインスタンスである、すべての取得は、現在のスレッドのスタックを実行特定を得ることです。

実行しているときに、スレッドの例外が発生した場合どうなります9。

例外がキャッチされていない場合は、スレッドが実行を停止します。もう一つ重要な点はこれです:このスレッドがオブジェクトのモニターを保持している場合は、そのオブジェクトのモニターが即座に解放されます

二つのスレッド間でデータを共有する方法10、

通知/待機し、それにスレッド間でオブジェクトを共有することにより、および/のnotifyAll、のawait /信号/喚起し、待機、BlockingQueueのブロックキューデータは、スレッドとデザインの間で共有されていると言うことsignalAll

11、睡眠との違いは何waitメソッド方法

睡眠()いくつかの時間のためのスレッドスリープになりますが、ロック解除しません
(待機を)スレッドをブロックし、ロックを解除し、使用する()/のnotifyAll()に通知して

12.生産者 - 消費者モデルの役割は何ですか

この問題は非常に理論的な、しかし非常に重要です。

1)することでバランスをとるシステム全体の効率を向上させるための電力を費やす生産者と消費者の生産能力をこれは、生産者と消費者のための最も重要な役割モデルであります

2)手段を生産者と消費者との間のより少ない接触をデカップリングの生産者 - 消費者モデルの副作用であり、デカップリング、より少ない接触が互いの制約を受信する必要なしに単独で開発することができ

使用しているもの13、ThreadLocalの

各スレッドが独立せずに自分のコピーを変更することができますので、単純にThreadLocal変数のメンテナンスを使用しているときにThreadLocalは、時間的なアプローチのためのスペースの一種で入れ、各独立変数のコピーを提供するために、変数のThreadLocalのスレッドを使用しますそれはコピーを、対応する他のスレッドに影響を与えます。

14、なぜ待機()メソッド、及びシンクブロックに呼び出される()/のnotifyAll()メソッドを通知します

このJDKは必須、待機()メソッドであり、第1のロックを呼び出す前に、オブジェクトを取得する必要があります()/のnotifyAll()メソッドを通知します

16.なぜ、スレッドプールを使用します

スレッドオブジェクトを再利用するために、頻繁に作成および破棄スレッドを避けてください。また、スレッドプールを使用することも柔軟同時プロジェクトの数に応じて制御することができます。詳細なスレッドプールは、こちらをクリックしてください。

スレッドがオブジェクトのモニターを保持するかどうかを検出する方法17、

Threadクラスは、モニターがオブジェクトobjである場合にのみ、holdsLock(オブジェクトobj)メソッドを提供しています。私たちは、スレッドがオブジェクトのモニターを保持しているかどうかを判断する方法があります知っている前に、複数のねじ面の質問を見るために並んでいました戻り時間のスレッドは、これは「特定のスレッドは、」現在のスレッドを指すことを意味する静的メソッドであること、当てはまるであろう。

18、同期とReentrantLockの差

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

(1)ReentrantLockのは、このようなデッドロックを回避し、ロックを取得するための待機時間を設定することができ

(2)ReentrantLockのは、様々な情報のロックを取得してもよいです

マルチチャネル通知を達成するために(3)ReentrantLockの柔軟性

また、ロック機構の両方が、実際には同じではありません。ReentrantLockの低レベルの呼び出しのロックの公園安全でない方法、

19は、並行処理の度合い何であるのConcurrentHashMap

ConcurrentHashMapの同時実行がセグメントのサイズで、デフォルトは同時にハッシュテーブルのConcurrentHashMapの最大の利点であるのConcurrentHashMapを、動作する16件のスレッドにそこまでできることを、どのような場合には、2件のスレッドがあります同時にハッシュテーブルは、ハッシュテーブルを得ることができた手段、16ですデータ?

20、ReadWriteLockは何ですか

ReentrantLockのが悪いと言ってないで、まず明確に見て、ちょうどReentrantLockのは時々制限があります。あなたがReentrantLockのを使用している場合は、それ自体がスレッドAの書き込みデータを防ぐためであってもよく、リードしたデータのデータの不整合スレッドBが発生するが、データを読み、読み出したデータは、データは変更されませんこの方法では、データの読み取り内のスレッドのC場合、スレッドDも、それは必要ありませんロック、それでもプログラムのパフォーマンスが低下し、ロックアップ。

このため、読み書きロックReadWriteLockの誕生前に。ReadWriteLockインタフェース、ReadWriteLockインタフェースを持つ特定の実装ReentrantReadWriteLockで、私たちは読み書きの分離を実現し、読み書きロックであります共有ロックがされて読み込み、書き込みロックは排他的です読んで読んで読んで、相互に排他的になるまで書き込み、書き込みと書き込み、読み込みと書き込みの間で相互に排他的ではなく、読み取りと書き込みのパフォーマンスを向上させます。

21は、どのようにブロックされたスレッドを目覚めさせます

スレッドが()の呼び出し待ちためブロックされ、スリープ()やjoin()メソッド発生した場合、スレッドを中断することができ、かつ例外:InterruptedExceptionを投げることによって、それをウェイクアップするために、IOスレッドが閉塞が発生した場合、何もしない、オペレーティングシステムIOため、実装、Javaコードとオペレーティングシステムに直接アクセスする方法はありません。

23、プログラムを書くためのJavaプログラマはデッドロックにつながります

25、不変オブジェクトは、マルチスレッド化を支援しようとしていました

メモリオブジェクトの視認性を確保するための不変オブジェクトは、コード実行の効率を高めるために、追加の同期手段を必要としない不変オブジェクトを読み取ります。

26、マルチスレッドスイッチのコンテキストは何ですか

マルチスレッド・コンテキスト・スイッチは、CPUスレッドの実行を求める処理のために別の場所ウェイトに既に実行中のスレッドからCPUスイッチの制御を指します。

27、あなたはタスクを提出する場合は、スレッドプールのキューがいっぱいになっている、そして何が起こるのだろう

ここでは、区別します:

あなたはLinkedBlockingQueueアンバウンド形式のキューを使用している場合は、キューが無制限である1)、それは問題で、LinkedBlockingQueueは、ほぼ無限のキューとみなすことができるので、あなたが無制限のタスクを格納することができ、実行されるのを待って、ブロッキングキューにタスクを追加し続けません

それは有界キューは、ArrayBlockingQueueを使用する場合は2)、最初のタスクは、次いで、maximumPoolSizeねじ山付加価値の数に基づいて、糸またはハンドルの数を増やす場合は、しかし、ArrayBlockingQueueが満杯継続、完全ArrayBlockingQueueにArrayBlockingQueueに追加されますRejectedExecutionHandler治療戦略は、完全なタスクを拒否するために使用される、デフォルトはAbortPolicyです

28.どのようなJavaのスレッドスケジューリングアルゴリズムが使用されています

先制。スレッドは、CPUがなくなった後、オペレーティングシステムは、全プライオリティスレッド優先順位、スレッドの飢餓状況やその他のデータに基づいて算出し、スレッドを実行する次のタイムスライスを割り当てられます。

29.のThread.sleep(0)である役割は何ですか

この問題は、その問題は私も一緒に、上記に関連しています。Javaのプリエンプティブスレッドのスケジューリングアルゴリズムので、ので、いくつかの低優先度のスレッドがCPUの制御に得ることができる可能にするために、あなたは(のThread.sleepを使用することができ、CPUの制御に入ることが多いスレッドの場合もあります0)手動でCPUの動作制御のバランスであるタイムスライスのオペレーティングシステムの割り当て、一旦作動トリガー。

30、スピンは何ですか

スレッドがユーザーモードとカーネルモードの切り替えに関連する問題を阻止するため、内部だけでいくつかの非常に簡単なコードの多くの同期コード、非常に高速な実行時間は、その後、操作のあまり価値があるかもしれないスレッドロックを待ちます。非常に高速な同期内のコード実行するので、ロック・スレッドのためのLETの待機がブロックされますが、同期の国境内で循環忙しいませんが、これはスピンです。あなたは何回がビジーサイクルロックを取得した後、ブロックされていることを発見していない場合は、これは、より良い戦略かもしれません。

31. Javaのメモリモデルとは何ですか

Javaメモリー・モデルは、マルチスレッドのJava仕様・アクセス・メモリを定義します。Javaのメモリモデルを完成させるには、はっきりと言うべきいくつかの単語を話すためにここにはありませんが、私は簡単にJavaのメモリモデルの一部を要約したものです。

1)メインメモリにJavaのメモリモデルメモリとワーキングメモリ。クラス変数間で共有されるクラスの状態は、メインメモリに格納されている、Javaスレッドがメインメモリにこれらの変数を使用するたびに、メモリ内の主な変数の一つを読んで、これらをメモリ上でできるようになります彼らのワーキングメモリ、これらの変数を使用し、独自のスレッドのコードを実行し、コピーを持って、1つのメモリ操作を作業そのものです。スレッドコードが終了した後、それはメインメモリに最新の値に更新されます

2)メインメモリを動作させるためのいくつかのアトミック操作、および作業メモリ変数定義

3)揮発性変数の規則の使用を定義します

4)事前発生、即ち、第1原理が発生し、A上に定義ルールBが先に結合し、そのような最初のコードの流れ、放出ロックアンロックの後の制御で発生しなければならないコードの制御フローの前部と同じスレッドのように、動作時に発生します最初のアクションは、後に、彼らは規則を満たしていなければならないなど、同じアクションロックロックを行ったコードの一部が事前発生のすべての規則に準拠していない場合は、あなたが特定のために、このコードは、追加の同期化対策を必要としないで行わなければなりませんこれは、非スレッドセーフであります

32. CASは何ですか

CASは、比較とスワップすなわち、比較と呼ばれる - 置き換えます。そこに3つのオペランドがあると仮定:AとVの期待値が同じメモリ値である場合のみと、メモリの値がtrue Bと戻り、に改定される場合は、メモリ値V、旧Aの期待値、B値は、変更される他に何何もないとfalseを返します。もちろん、CAS変数とポストにそれ以外の場合は、古い期待スレッドを、各変数がその値を最新取得するには、メインメモリであることを保証するように、揮発性でなければならない、それはAの値がしません変更は、限り、常に特定の操作が失敗したCAS、それは決して成功しないだろう。

33.何が楽観と悲観的ロックです

1)楽観的ロック:その名は、それが、比較のロックを保持する必要はありませんので、楽観的状態、競争は常に起こらないことを楽観的ロック、生成された同時操作の間、スレッドの安全性の問題については、わかるように - これら二つの交換をこれは、前記衝突が失敗した場合、対応する再試行ロジックがなければならない、メモリ内の変数を変更するアトミック動作試みとして動作します。

2)悲観的ロック:または、その名の通り、悲観的な状態、競争は常に起こるだろうという悲観的ロック、そのたびにリソースの動作を生成した同時操作の間、スレッドの安全性の問題のために、排他的に開催しますロック、同期のような、行き当たりばったり、リソースのロックを直接操作します。

36、セマフォはどのような役割

セマフォは、その役割は、同時特定のコードブロックの数を制限するセマフォです。コンストラクタはセマフォ持って、あなたはint型の整数を渡すことがn個、最大n n個を超えた場合、スレッドは、このコードブロックを完了するまでアクセスできるスレッドは、待ちをしてください、次のスレッドでのコードの一部を表し、再入国。これは、同期化に等価な、INT n = 1の整数であれば、着信セマフォコンストラクタタイプことがわかります。

39、そしてより良い選択であるシンクブロック同期方法、

シンクブロック、さらに同期コードよりも全体的なプロセスの効率を高めるシンクブロック外部コードが非同期であることを意味します。できるだけ同期:その原理を知ってください。

この記事を通して、私はより良い同期の範囲が、少し余分を置くが、ロックが粗大化と呼ばれるJava仮想マシンの最適化の方法がまだ存在で、この方法は、範囲が増加を同期させることです。これは、たとえばStringBufferのために、それはスレッドセーフなクラスで、最も一般的な天然のappend()メソッドは同期方式有用である、我々は、コードがロックを繰り返されることを意味アペンド文字列を、繰り返される書き込み - >ロック解除この性能欠点は、Java仮想マシンコードを繰り返し追加するメソッド呼び出しがロックされているように、Java仮想マシンを繰り返し、このスレッドにカーネルモードとユーザモードとの間で切り替えることを意味するので複数頭尾appendメソッドを追加する操作、拡張操作を粗く、それはこのようにロックを低減、大シンクブロックになる - >ロック解除回、有効コード実行の効率を改善します。

40、高い同時実行は、タスクの実行時間は、スレッドプールを使用する方法を短い管理者ですか?どのように並行処理は、タスク実行スレッドプールを使用して、長時間ビジネス高くないですか?高い同時実行、スレッドプールを使用してどのくらいの時間が業務執行サービス?

これは私がオンライン並行プログラミングで見る問題であり、私が最後にこの質問を入れて、私は、これは、非常に専門的、非常に実用的な非常に良いですので、誰もが、見てについて考えることができると思います。この問題では、個人的な見解は以下のとおりです。

1)高い同時、ビジネスタスク実行時間の短い、スレッドプール内のスレッドの数がスレッドコンテキストスイッチングを減らすCPUコア+1の数に設定することができます

2)高い同時実行ではない、長い時間の事業領域に対して実行されるように別々のタスクを参照してください。

a)のビジネスは、長い時間が、操作は非常にすべてのCPUが引退してみましょうと座っていない、CPU IOを取らないので、あなたはCPUを聞かせて、プール内のスレッドの数を増やすことができ、IO集約型のタスクであるIO操作、に焦点を当てている場合より多くのビジネスを扱います

B)トラフィックが長時間運転に集中している場合は、計算集約的なタスクであり、算出さは、そのない溶液、及び(1)のように、プール内のスレッドの数が少なくなるように設定されている、スレッドコンテキストスイッチングを減らします

C)高い同時実行、長時間の業務執行は、このタイプのタスクを解決する鍵は、スレッドプールにではなく、全体的なアーキテクチャの設計では、彼らはデータキャッシュのいくつかの内部でビジネスを行うことができるかどうかを確認最初のステップであるために、第二には、サーバを増やすことですステップは、スレッドプールを設定すると、スレッドプールは、その他の関連記事への参照を設定します。最後に、長い時間の業務執行上の問題は、また、あなたが分割タスクとデカップリングにミドルウェアを使用することができるかどうか、それを分析する必要があるかもしれません。

リファレンス40マルチスレッドのJava面接の質問と回答

公開された59元の記事 ウォンの賞賛244 ・は 90000 +を見て

おすすめ

転載: blog.csdn.net/Smile__1/article/details/104235695