最強のマルチスレッド44の面接の質問と回答の歴史:ねじロック+ +スレッドプールのスレッド同期など

1、並行プログラミングの三つの要素?

1)アトミック

アトミックは、1つまたは複数の操作を指し、実行いずれかの他のすべての操作は実行せずに実行中、または全てに中断されることはありません。

2)可視

共有変数を操作する複数のスレッドの視認性を指し、変数は、スレッドを変更し、前記他のスレッドは、直ちに変更の結果を見ることができます。

可視性のアプローチを実現します:

同期またはロック:ロックの最新値のリリースは可視性を達成するために、メインメモリにフラッシュする前に、同じ時間に1つだけのスレッドが、ロックコードの実行を取得することを確実にするために。

3)注文

発注、注文コードで行わすなわち、プログラムの実行順序。


図2に示すように、マルチスレッド値はありますか?

1)マルチコアCPUを活用

マルチスレッド、本当にお互いに干渉することなく、同時にいくつかの完了にマルチスレッドのアプローチ、CPUをフルに活用の目的を達成するために、マルチコアCPUの利点を再生することができます。

2)閉塞を防ぎます

それは、スレッドのコンテキストスイッチにつながる、とシングルコアCPU上のプログラムの全体的な効率が低下しますので、作業効率の観点の手続きの点からは、シングルコアCPUだけでなく、マルチスレッド、マルチスレッド実行の利点を再生します。しかし、我々はまだシングルコアCPU、マルチスレッドアプリケーションを持って、目詰まりを防ぐためです。シングルスレッドを使用したシングルコアCPUは、その限りこのスレッドがブロックされているように、データをリモートでそれを読むと言う前に、戻りデータで、ピアまだ返却されていないとノーセットタイムアウト、その後、プログラム全体が帰ってきた場合だけ、だと思います動作を停止。マルチスレッドは、この問題、コードの実行スレッドがブロックされたデータを読み取ることがあっても、同時に実行するスレッド数を防ぐことができ、それは他のタスクの実行には影響しません。

3)モデル化を促進

これは、それほど明白ではないのもう1つの利点です。あなたが大規模なタスクA、シングルスレッドプログラミングを持っていると仮定し、その後、あなたがプログラム全体のモデルがあまりにも面倒で構築し、多くのことを考慮する必要があります。しかし、多くの単純な、その後、それぞれ、いくつかの小さなタスク、タスクB、タスクC、タスクDに分け、この偉大なタスクならば、プログラムのモデルを確立し、マルチスレッドを介してこれらのタスクを実行します。


3.スレッドを作成する方法は何ですか?

1)スレッドクラス継承Threadクラスを作成します。

2)、Runnableインタフェースクラスを介してスレッドを作成

3)呼び出し可能と未来を通じてスレッドを作成します。


スレッドを作成するには、3つの方法の4の比較?

1)マルチスレッドインタフェースを作成するRunnableを、呼び出し可能な方法を達成します。

利点は以下のとおりです。

Threadクラスは、Runnableインタフェースまたは単に呼び出し可能インターフェースを実装して、あなたはまた、他のクラスから継承することができます。

このように、複数のスレッドが同じターゲット・オブジェクトを共有することができる、より良い反映するように、分離することができ、同じリソースは、CPU、コードとデータの明確なモデルを形成する場合に対処するため、複数のスレッドで同じですオブジェクト指向の考え方。

短所は以下のとおりです。

プログラミングはあなたが現在のスレッドにアクセスしたい場合は、あなたがにThread.currentThread()メソッドを使用する必要があり、やや複雑です。

2)Threadクラスの継承の方法を使用して複数のスレッドを作成します

利点は以下のとおりです。

シンプル書き、あなたは現在のスレッドにアクセスする必要がある場合、あなたは現在のスレッドを取得するためにThread.currentThread()メソッド、直接使用これを使用する必要はありません。

短所は以下のとおりです。

ThreadクラスのThreadクラスは継承されているので、他の親を継承することはできません。

3)Runnableを、呼び出し可能の差を

  • 呼び出し可能な所定の(オーバーライド)Runnableを所定(オーバーライド)メソッドが実行されるメソッド呼び出し()は()。
  • 呼び出し可能なタスクは、戻り値の後に実行することができ、かつのRunnableタスクは、戻り値ではありません。
  • 呼び出しメソッドが例外をスローすることが、実行方法はできません。
  • 呼び出し可能なタスクは、非同期計算の結果を表しFutureオブジェクトを取得することができます実行します。これは、計算が完了すると、検索結果の計算のために待機するように、計算をチェックする方法が完了しています。今後のオブジェクトによってタスクの実行をキャンセルし、任務の実装を理解するだけでなく、結果を得ることができます。

図5に示すように、スレッドの状態流れ図

ライフサイクルとスレッドの5つの基本状態:

 

 

 

第五Javaスレッドは、基本的な状態を持っています

1)新しい状態(新):作成されたオブジェクトの後ときのような新たな状態になりスレッド:スレッドT =新しいMyThread()。

2)レディ状態(Runnableを):start()メソッド(t.start(呼び出し側スレッドのオブジェクト);)、レディ状態であるスレッド。準備状態のスレッドに、このスレッドの例示では、このスレッドは直ちに実行されます)t.startの実装(と言うことではない、任意の時点で実行されるようにスケジュールCPUを待って、準備ができています。

CPUのスレッドのスケジューリングがレディ状態で起動すると、この時間は本当にランモードに入るのスレッドを実行することができました:3)の状態(実行中)を実行します。注:準備状態が、それは、実行中の状態を入力するために、スレッドの実行され、動作状態にアクセスする唯一の手段である第一、すべての準備が整っの状態でなければなりません。

4)ブロッキング状態(ブロック):、何らかの理由でスレッドを実行し、一時的にそれがレディ状態に入るまでのブロックに、この時間は、CPUを使用して実行を停止する権利を放棄し、再びCPUと呼ばれるチャンスがあります実行モードになります。生成され、ブロックされた状態を阻止するための理由に応じて3つのタイプに分けることができます。

ブロッキング1.待ち:実行待ち状態動作のスレッド()メソッドは、スレッドが待機状態閉塞に入るように、

2.同期ブロック - 同期を得る際のスレッド同期ロック失敗(ロックが別のスレッドによって占有されたため)、それは同期ブロッキング状態になります。

3.その他のブロックされた - 睡眠によって()、または呼び出し元のスレッド()または発行されたI / O要求を、ブロックされた状態にスレッドに参加します。睡眠()タイムアウト、参加()またはタイムアウトは、スレッドの終了を待つか、I / O処理が再びレディ状態に、スレッドを終了しました。

5)死状態(デッド):スレッドの実行は、run()メソッド、ライフサイクルの糸端を介して、または、異常終了しています。


6.スレッドプールとは何ですか?作成するためのさまざまな方法は何ですか?

スレッドプールは、複数のスレッドを作成することであるアドバンス、タスクに対処する必要がある場合、スレッドプールのスレッドは、スレッドを処理して破壊されることはありませんが、次のタスクを待った後、タスクを処理します。作成と破棄のスレッドがシステムリソースを消費しているので、あなたが頻繁に作成し、破壊するスレッドにしたいとき、そのシステムのパフォーマンスを改善するために、スレッドプールの使用を検討することができます。

Javaのjava.util.concurrent.Executorは、スレッドプールを作成するために使用されるインタフェースの実装を提供します。

スレッドプールの4種類が作成されます。

(1)スレッドプールキャッシュ可能を作成newCachedThreadPool

(2)固定サイズのスレッドプールを作成newFixedThreadPool、あなたは同時スレッドの最大数を制御することができます。

(3)定期的な及び定期的なタスクの実行をサポートするために、固定サイズのスレッドプールを作成newScheduledThreadPool。

(4)newSingleThreadExecutorシングルスレッドのスレッドプールを作成し、それだけでのみワーカー・スレッドのタスクを実行するために使用します。


7.スレッドプールの利点は?

1)破壊されたオブジェクト生成のオーバーヘッドを低減する、既存のスレッドを再利用します。

目詰まりを避けるために、リソースのための過当競争を回避しながら、2)効果的に、システムリソースの使用率を向上させる、同時スレッドの最大数を制御することができます。

3)定期的に、シングルスレッド、同時制御を実行する実行タイミングを提供します。


違いはあるものの中に同時コレクション8.Javaのセットを同期しますか?

シンクロナイズドコレクション:

  • ベクター
  • スタック
  • ハッシュ表
  • Collections.synchronizedを生成する方法

並行コレクションクラス:

  • ConcurrentHashMapの
  • CopyOnWriteArrayListと
  • CopyOnWriteArraySet等

9.同時同期差セットのセット

並行コレクションは、マルチスレッドと並行処理のセットが、しかし、高いスケーラビリティの集合によって複雑にスレッドセーフなのに適したセットを提供同期されます。同時コレクションのコレクションよりも同期は、月またはリストロックされ、そして、そのようなConcurrentHashMapのよう同時のコレクションとなり、コレクション全体を同期、主としてロックに、はるかに遅くなります

複数のスレッドが他のロック解除断片(下地赤黒木に参加するJDK1.8バージョン)にアクセスすることを可能にしながら、マップ全体が、ほんの数断片関連するロック、いくつかのセグメントに分割されます。


10.一般的な並行処理ツールは何?

  • たCountDownLatch
  • CyclicBarrierを
  • セマフォ
  • 交換

11.CyclicBarrierとたCountDownLatchアプリケーションシナリオ?

たCountDownLatch:スレッド(またはそれ以上)、あなたは事を完了するために他のN個のスレッドを待って実行することができます。CyclicBarrierを:Nスレッドは、いずれかのスレッドが完了する前に、すべてのスレッドが待機しなければならない、お互いを待ちます。

たCountDownLatchの使用シナリオ:

一部のアプリケーションでは、背後に物事を行うための要件を満たすためにのみ、特定の条件の後に待つ必要があり、スレッドが完了したと同時に、その後の操作のために、あなたがたCountDownLatchを使用することができ、この時間は、イベントをトリガします。

CyclicBarrierを使用シナリオ

CyclicBarrierを、マルチスレッドコンピューティング・データのために使用され、最終的にコンピューティングシナリオの結果をマージすることができます。


違い12.CyclicBarrierとされたCountDownLatch

1)たCountDownLatchは、単純に別のスレッドが彼の実行待ちれるまで待機するスレッドが完了したことを意味し、現在のスレッドが実行を続けることができたときに通知するカウントダウン()メソッドを呼び出します。

すべてのスレッドがすべてのスレッドが開始した後のawait()メソッドを入力する準備ができるまで2)CyclicBarrierをすべてのスレッドが待って!

3)たCountDownLatchカウンタは一度だけ使用することができます。カウンタはリセットするCyclicBarrierをリセット()メソッドを使用することができます。だから、CyclicBarrierを、このような計算エラーが発生した場合など、より複雑なビジネスシナリオを扱うことができ、あなたはカウンタをリセットし、スレッドが再び実行させることができます。

4)CyclicBarrierをはまた、CyclicBarrierをブロックされたスレッドの数を取得する方法をgetNumberWaitingのような他の有用な方法を提供します。isBroken方法は、ブロックされたスレッドが中断されたかどうかを知るために使用されます。中断された場合はtrue、そうでない場合はfalseを返します。

13.synchronizedの役割?

Javaでは、同期キーワードはつまり、マルチスレッド環境で、制御コードセグメントは、複数のスレッドの同時実行を同期されていない、スレッドの同期を制御するために使用されます。

同期のいずれかのコードの断片に加え、この方法に加えてもよいです。


14.volatileキーワードの役割

可視性のために、Javaは視認性を確保するために揮発性のキーワードを提供します。

共有変数がvolatile宣言されたとき、それは変更された値は、メインメモリに即座に更新されることを保証します、他のスレッドが読む必要がある場合には、それがメモリに新しい値を読み込みます。

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


15. CASは何ですか

CASは、略語の比較とスワップである、それは我々が比較交換を呼んでいます。

CASはロックベースの操作であり、楽観的ロックです。Javaでは、楽観と悲観的ロックにロック。悲観的ロックは、このようなスレッドがロックを取得する前にロックを解除した後などのリソース、ロックされて、次のスレッドがアクセスすることができます。レコードバージョンに追加することによってデータを取得するなど、何らかの方法でロックしないことによって、処理リソースへの幅広いアプローチを取る楽観的ロックは、より悲観的ロックのパフォーマンスが大幅に改善されています。

CAS

操作は3つのオペランドを含んでいます -

メモリ位置(V)、元の値(A)と新たな値(B)と期待されます。メモリアドレスの値の値が同じである場合、値がB.内部メモリに更新します CASは、無限ループを介してデータを取得することで、最初のラウンドでRuoguoサイクルは、スレッドがアドレス値内部Bスレッド変更されます、スレッドは実行する次の可能な機会にサイクルを回転する必要があります。

カテゴリの下のほとんどは、java.util.concurrent.atomicパッケージは、CAS(のAtomicInteger、AtomicBoolean、AtomicLong)で動作して実装されています。


16. CASの問題

1)問題を引き起こす可能性がCASのABA。スレッドBに数値を、その後、彼らは、この時点では考えられCASは、実際には、あまりにも変更されていて、この問題を解決するには、あなたがそれぞれの操作に加えて、バージョン1を識別するために、バージョン番号を使用することができ、変更されていないにそれを変更。java5では、問題を解決するためにAtomicStampedReferenceを提供されています。

2)コードブロックのアトミック性を保証するものではありません。

CASアトミック操作機構は、変数の知識を確保するが、全体のコードブロックのアトミック性を保証することはできません。このような一般的な三つの変数は、原子性を更新することを確保する必要性として、あなたは、同期を使用する必要があります。

3)CASは、CPU使用率の増加を引き起こします。彼は、CAS処理の前にスレッドのステータスを取得していない場合、CPUリソースが常に占有され、判断のサイクルがあると述べました。


17.未来とは何ですか?

並行プログラミングでは、私たちはしばしば達成するために、非ブロッキングモデルを使用する3つの以前のマルチスレッド、継承またはスレッドのクラス実行可能なインターフェイスを実装するかどうか、彼らが得た以前の結果の実施を保証することはできません。コールバックインターフェースを実装し、マルチスレッド実行の結果今後受信することができるによって。

将来は、結果はタスクの実行の成功または失敗した後、適切な処置を行うためにコールバックを追加することができ、この結果のための完全な非同期タスクを持っていない可能性を表します。


18. AQSは何ですか

AQS AbustactQueuedSynchronizerは、レベルの同期、int型の変数で表される同期状態を改善するためのJavaベースのツールであり、同期状態を管理するためにCASの一連の動作を提供し、短いです。

AQSは同様であるAQSを使用して、フレームロックと同期を構築するために使用される簡単かつ効率的に広くシンクロナイザの多数を構築することができる、我々は、他のReentrantReadWriteLock、SynchronousQueue、FutureTaskとしてReentrantLockのセマフォを、上述したようなものですこれは、AQSに基づいています。

AQSは、2つの同期方法をサポートしています。

1.独占式

2.共有

そのようなユーザーフレンドリーようなモジュラーReentrantReadWriteLockなどセマフォたCountDownLatchなどの共有排他としてReentrantLockのの同期成分の種類を、実装。要するに、AQSを使用するために基本的なサポートを提供し、どのように達成組み立てるには、ユーザーは無料でプレイすることができます。


19.ReadWriteLockは何ですか

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

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


20.FutureTaskは何ですか

この事実は、先に述べた、FutureTaskはという非同期操作のタスクを示します。タスクの非同期操作の結果にアクセスするために待機させることができる、完成された呼び出し可能な実装クラスを渡すことができFutureTaskは、操作タスクをキャンセルするかどうかが決定されます。もちろん、FutureTaskまた、Runnableインタフェースの実装クラスので、そうFutureTaskはまた、スレッドプールに配置することができます。


違い21.synchronizedとReentrantLockの

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

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

(2)ReentrantLockの各種情報のロックを取得してもよいです

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

また、両方のロック機構は、実際には同じではありません。ReentrantLockの低レベルロックのその公園安全でないメソッドを呼び出し、同期操作は、私は判断できない、対象ヘッダマークワードであるべきです。


22.楽観と悲観的ロックとは何ですか

(1)楽観的ロックを:その名のとおり、同時動作間のスレッドの安全性の問題は、楽観的な状態を生成するために、楽観その競争をロックすることと比較します常に発生しませんので、ロックを保持する必要はありません - 2を交換します1つのアトミック操作などのアクション前記競合に失敗した場合、メモリ内の変数を変更しようと、それに対応する再試行ロジックが存在すべきです。

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


23.スレッドBスレッド変数を変更する方法を知っています

  • 揮発性の修飾変数
  • 同期の修正方法は、変数を変更します
  • 待っ/通知
  • ポーリング中

24.synchronized、揮発性、CAS比較

  • 同期悲観的ロックは、目詰まりの原因となりますプリエンプティブ、他のスレッドです。
  • 揮発性マルチスレッド共有変数は、可視性を提供し、最適化を並べ替え命令を禁止しています。
  • CASは、楽観的ロック競合の検出(非ブロッキング)に基づいています

25.sleep方法とwaitメソッドの違いは何ですか?

この質問しばしば、尋ね睡眠とメソッドメソッドを待っているスレッドがオブジェクトのモニターを持っている場合、睡眠法は法を待って、このオブジェクトのモニターを放棄しないことを除いて、いくつかのCPU時間を放棄するために使用することができますが、これをあきらめますオブジェクトモニター


何26.ThreadLocalこと?用途は何ですか?

ThreadLocalのスレッドが変数ツールのローカルコピーです。スレッドとスレッドに格納されているオブジェクトのプライベートコピーは、マッピングを行うために、主のために、非常に同時シナリオでは、お互いを乱すことなく、個々のスレッド間の変数は、特に、各スレッドが意味をなさない従属変数の値のために、状態の呼び出しなしで達成することができます完全なシーン操作。

簡単に言えばThreadLocalのは、各スレッドが開い実装、データの分離に対処するための法律をThreadLocal.ThreadLocalMap維持する時間的なアプローチのためのスペースの一種である、データが共有されていない、自然に、セキュリティスレッドの疑いはありません。


27.なぜ()メソッドを待ってから、シンクブロックに呼び出される()/のnotifyAll()メソッドを通知します

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


28.マルチスレッド同期方法は何ですか?

synchronizedキーワード、分散ロックのロックロック。


29.スレッドのスケジューリングポリシー

スレッドスケジューラは、次のことが発生した場合、それはスレッドの実行を終了します、しかし、実行するために最も優先度の高いスレッドを選択します:

CPUを占有する権利から抜け出すために(1)スレッド体と呼ばれる降伏方法

(2)スリープメソッド呼び出したスレッド本体がスリープ状態にスレッドを可能にします

(3)IO処理スレッドがブロックされているので

(4)また、より高い優先度のスレッドが表示され

(5)タイム・スライスをサポートするシステムでは、タイムスライスは、スレッド満了します

並行処理の度合いはどのようなものです30.ConcurrentHashMap

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


31.Javaデッドロックとどのように回避しますか?

Javaは、Javaのデッドロック状況に少なくとも二つのスレッドと2つの以上のリソース2つの以上のスレッドが永久的にブロックされているデッドロック状態でのプログラミングです。

デッドロックのジャワの根本的な原因は以下のとおりです。閉ループアプリケーションロックを申請する際のクロスが発生しました。

デッドロックの原因

1)ロックの複数の関連する複数のスレッドは、これらのロックが交差存在し、それがロック依存閉ループを引き起こす可能性があります。

例:スレッドの場合にはAロックダウンを取得し、アプリケーションのロックBを解放しませんでした、そして、それは最初のロックAを取得する必要がありますロックを解除する前に、別のスレッドロックB、およびBを得ているので、閉ループは、デッドロック・サイクルを発生します。

2)デフォルトのロックアプリケーションの操作がブロックされています。

だから、デッドロックを回避するために、顔の場合に交差する複数のオブジェクトをロックする必要があり、我々は慎重に依存ロックループに可能性のリードがあるかどうか、これらのオブジェクトのクラスのすべてのメソッドを調べる必要があります。すべてのすべてで、同期のアプローチに他のオブジェクトとメソッドの遅延同期メソッド呼び出しを避けるようにしてください。


32ブロックされたスレッドを目覚めさせる方法

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


33.不変オブジェクトは、マルチスレッドを支援するつもりでした

上記で述べた問題は、不変オブジェクトは、追加の同期を必要としない不変オブジェクトを読み取るために、メモリ・オブジェクトの視認性を確保するために存在する、コード実行の効率を高めることを意味します。


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

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


35.あなたがタスクを送信した場合、スレッドプールのキューがいっぱいになった場合、何が起こります

ここでは、区別します:

  1. あなたはLinkedBlockingQueueアンバウンド形式のキューを使用している場合は、キューが無制限である、それはLinkedBlockingQueueは、ほぼ無限のキューとみなすことができるので、あなたが無制限のタスクを格納することができ、実行されるのを待っているブロッキングキューにタスクを追加していく、重要ではありません。
  2. それは、このようなArrayBlockingQueue使用されるキューを制限されている場合は、最初のタスクはArrayBlockingQueueフルを続け、しかし、スレッドの数を増やす場合、maximumPoolSize値スレッドの数を増やすか、処理する、フルArrayBlockingQueue ArrayBlockingQueueに追加され、それが使用されますRejectedExecutionHandler処理タスクの拒否ポリシーがいっぱいになる、デフォルトはAbortPolicy

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

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


37.スレッドスケジューラ(スレッドスケジューラ)とタイムスライス(タイムスライス)とは何ですか?

スレッドスケジューラは、CPU時間のRunnableをスレッド割り当ての状態に責任があるオペレーティングシステムのサービスです。我々はスレッドを作成し、それを起動したら、それはスレッドスケジューラの実装の実装に依存します。使用可能なスレッドのRunnableに割り当てられた利用可能なCPU時間である処理時間スライスを指します。優先順位のスレッドまたは上の待つスレッドできるCPU時間を割り当てます。アプリケーションは、それがより良い選択(つまり、アプリケーションがスレッドの優先順位に依存せてはいけないと言うことです)で制御するので、スレッドのスケジューリングは、Java仮想マシンによって制御されていません。


ロックで何38.Java同時実行APIインタフェース(ロック・インターフェース)は?コントラスト同期はどんな利点があるのでしょうか?

ロックインタフェースは、同期方法よりも、ブロックを同期して、よりスケーラブルなロック操作を提供します。彼らは、より柔軟な構造を可能にする完全に異なる特性を有していてもよく、およびオブジェクトクラスに関連する複数の条件をサポートすることができます。

その利点は以下のとおりです。

  • あなたは公平ロックすることができます
  • スレッドがロックを待っているの応答時間を中断することができます
  • ことができますスレッドがロックを取得しようとすると、すぐにと、ロックを取得したり、いくつかの時間を待つことができない返します
  • 、異なる範囲で異なる順序でロックを取得し、解放することができます

39.セキュリティスレッドSingletonパターン

ありふれた問題は、言うべき最初の事はスレッドセーフであるシングルトンパターンを意味します:クラスのインスタンスは、マルチスレッド環境での外に一度作成されます。書き込みのシングルモードの多くの例がありますが、私が要約します:

セキュリティスレッド:(1)飢えシングルモードの実施例を書きます

(2)単一のアイドラ実施の形態の書き込み:非スレッドセーフ

(3)ダブルチェックロックシングルトンを書く:セキュリティスレッド


役割とは何ですか40.Semaphore

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

何41.Executorsクラスですか?

執行は、ツールメソッドれたExecutor、ExecutorService、ScheduledExecutorService、ThreadFactory、呼び出し可能なクラスを提供します。

執行は簡単にスレッドプールを作成するために使用することができます


42. Threadクラスのコンストラクタは、静的なブロックが呼び出されたスレッド

これは非常にトリッキーかつトリッキーな質問です。注意:Threadクラスのコンストラクタ、静的ブロックは、スレッドクラスは、新しいスレッドと呼ばれている、およびメソッド内のコードを実行するスレッド自体によって呼び出されています。

上記の文はあなたが混乱して感じさせるならば、私は、例えば、その後、新しいスレッド2という新しいスレッド2でスレッド1、主な機能を前提としています。

コンストラクタ(1)スレッド2静的ブロックは、スレッド2メインスレッドの呼び出しであるrun()メソッドは、自身のスレッド2呼び出され

構造(2)スレッド1静的ブロックの方法は、run()メソッドは、そのスレッド1呼び出されるスレッド1、スレッド2と呼ばれ

43.より良い選択で同期およびシンクブロック、方法

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


スレッドの44.Java番号は珍しいすぎて何を引き起こすのでしょうか?

ライフサイクルコスト1)非常に高いスレッド

2)過度のCPUリソースを消費

使用可能なプロセッサの数よりも多くを実行できるスレッドの数ならば、アイドル状態のスレッドが存在します。アイドル多数のスレッドがガベージコレクタに圧力をもたらすために、多くのメモリを取るだろう、とCPUのリソースの競合時に多数のスレッドは、他のパフォーマンスのオーバーヘッドが発生します。

3)の安定性を低下させます

そこJVM上の制限は、スレッドの数を作成し、この制限は、プラットフォームからプラットフォームに変化するであろうし、複数の要因に付し、JVM起動パラメータ、リクエストのスレッドコンストラクタスタックサイズ、および基礎となるオペレーティング含みます制限システムスレッド上のように。これらの制限の破壊した場合は、OutOfMemoryErrorが発生をスローすることがあります。

おすすめ

転載: www.cnblogs.com/jobbible/p/11691681.html
おすすめ