同時マルチスレッドのJava

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

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

 

2.javaどのようにスレッドダンプファイルを取得するには

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

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

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

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

 

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

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

 

違い4.synchronizedとReentrantLockの

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

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

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

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

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

 

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

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

 

6.ReentrantLockは何ですか

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

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

 

7.FutureTaskは何ですか

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

 

8.Linux環境下では最長のCPUを使用するスレッド見つける方法

これは、私はかなり無意味に感じる部分の実際的な問題です。あなたは行うことができます。

pidが(1)買収プロジェクト、JPSまたはPS -ef | grepのジャワは、前にこのことについて話をしています

(2)トップ-H -p PIDを、順序を変更することはできません

あなたは、現在のプロジェクト、CPU時間の各スレッドの占有率をプリントアウトすることができるように。この劇は、私はノートブックの丘は、Linux環境下でJavaプロジェクトを展開していなかった、オペレーティングシステムのネイティブスレッドのスレッドでLWP、ですので、同社は、Linux環境で展開プロジェクトを使用している場合、デモ、ユーザーや友人をキャプチャする方法がないことに注意してください、あなたは試すことができます。

+「JPSは、PID」あなたは簡単に高いCPUスレッドのスレッドスタックとバーを見つけることができる「PID -pトップ-H」を使用し、それによって、位置合わせは通常ので、無限ループ内のコードの結果の誤った操作、高いCPUの理由を占めます。

最後にLWPから抜け出す、「PID -pトップ-Hは」小数「はJPSは、PID」の数は、それを変換、あなたはCPU-高いスレッドに進ナビゲートすることができますされているローカルスレッドの脱却、であることを言及現在のスレッドが積み重なります。

 

9.スレッド実行中の出現の例外とどうなりますか

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

 

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

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

 

11スレッドとプロセスの違いは?

次の処理に少なくとも1つのプログラムは、プロセスの下でのプロセスに少なくとも一つのスレッドは、プログラムの実行速度を高めるために複数のスレッドを持つことができ、があります。

 

12スレッドの保護者は何しているのですか?

デーモンスレッドは、バックグラウンドでの特別なプロセスを実行しています。これは、制御端子とは無関係であり、定期的にいくつかのタスクまたは処理を待ついくつかのイベントを実行します。Javaのガベージコレクションのスレッドでは、特殊なスレッドガードです。

 

13.スレッドを作成するさまざまな方法は何ですか?

スレッドを作成するための3つの方法があります。

スレッドの継承されたメソッドを再実行します。

Runnableを実装します。

呼び出し可能インターフェースを実装します。

 

14.違いは何実行可能と呼び出し可能なものであると言いますか?

呼び出し可能な実行可能な戻り値は、呼び出し可能で実行可能な補完するものとして見ることができるの戻り値を取得することはできません。

 

15.スレッドの状態は何ですか?

スレッドの状態:

NEWはまだ開始されていません

RUNNABLEは実装されています

BLOCKEDブロックされた(同期ロックまたはロックIOをブロックします)

永久待ち状態を待ち

指定した時刻に再目覚めの状態を待ってTIMED_WAITING

TERMINATED実行が完了しています

 

16.睡眠()と(待つ)の違いは何ですか?

異なるクラス:スレッドから睡眠は()、Objectから()待ちます。

ロックを解除しない()睡眠;待つ()ロックを解除:ロックを解除してください。

自動的に回復するためにスリープ()時間;待つ()通知()/のnotifyAll()直接のきっかけを使用することができます異なるを使用してください。

 

17.通知()とのnotifyAll()の違いは何ですか?

()のnotifyAll後にスレッドを覚ます)(通知、すべてのスレッドをウェイクアップします。notifyAll()の呼び出しの後に、すべてのスレッドがロックプールを待っているプールによって移動され、ロックして、競争に参加、成功し再び競争するためにリリースされるロックのためのロック待ちの後にプールに滞在し、失敗した場合、進んで競合します。そして、)(通知のみスレッド、特定の仮想マシン・ウェイクによって制御されているスレッドをウェイクアップします。

 

18.スレッドのrun()およびstart()の違いは何ですか?

操作のための時にコード実行スレッドを実行スレッド、()メソッドを起動する()メソッドを起動します。実行())(繰り返し呼び出され、開始することができますが、一度だけ呼び出すことができます。

 

19.いくつかの方法がありますスレッドプールを作成しますか?

スレッドプールを作成するための7つの方法がありますが、コアが最後です。

newSingleThreadExecutor():それはすべてのタスクが順番に実行されていることを保証しますので、それは、無限の作業キューを操作し、1に制限されているワーカースレッドの数によって特徴付けられる、タスクがアクティブで、許可しないまで存在しますユーザースレッドの数を回避することができる変化スレッドプールの変化の例。

newCachedThreadPool():短期的な多数のタスクを処理するためのスレッドプールでいくつかの特徴的な機能を備えています。それは何のスレッドが利用できない場合、それは新しいワーカースレッドを作成しますキャッシュ、スレッドをキャッシュして再利用しようとします。場合60秒以上は、終了し、キャッシュから削除されたアイドル時間をスレッド、長時間のアイドルは、このスレッドプールは、すべてのリソースを消費しません。SynchronousQueueは内部作業キューとして使用します。

(nthreadsの値INT)newFixedThreadPool:nthreadsの値ワーカースレッドへの任意の時点までの無制限の作業キューの使用の背後にリユース指定された数(nthreadsの値)のスレッドがアクティブになっています。これは、タスクの数は、アクティブキューの数を超えた場合、空きスレッドを待っていることは作業キューに表示されることを意味し、ワーカースレッド出口がある場合は、指定した番号にnthreadsを補うために作成された新しいワーカースレッドがあるでしょう。

newSingleThreadScheduledExecutor():シングルスレッドのプールを作成し、ScheduledExecutorServiceリターン、または定期的タイミングがスケジュールに動作することができます。

newScheduledThreadPool(INT corePoolSize)とnewSingleThreadScheduledExecutor()同様に、ScheduledExecutorServiceが作成され、ワー​​クワーカースレッドの単一または複数の点を除いて、スケジューリング作業をタイミングまたは定期することができます。

newWorkStealingPool(int型の並列処理):これは、多くの場合、これは内部ForkJoinPoolを構築する方法を作成するために追加する前に、スレッド・プール、Javaの8を見過ごされている、ワークスチール・アルゴリズム、並列処理タスクの使用は、処理シーケンスを保証するものではありません。

ThreadPoolExecutorは():スレッドプールの中で最も原始的で作成され、ThreadPoolExecutorのためにパッケージ化されている方法を作成するには、上記の手順。

 

20.スレッドプールのステータスは何ですか?

RUNNING:これは、新しいタスク、タスクの待ちキューの処理を受け入れるために、ほとんどの正常な状態です。

SHUTDOWN:新しいタスクの提出は受け付けませんが、タスクキューを待って対処していきます。

STOPは:、もはや待っていないタスクキューを処理し、新しいタスクの提出を受け入れるスレッドがタスクを実行している中断されません。

片付け:すべてのタスクが破壊され、workCountは0、状態を片付けに変換するスレッドプールの状態で、フックメソッドを実行する終了()。

TERMINATED:()メソッドを終了した後、状態はスレッドプールになります。

 

21.スレッドプールを提出()およびexecute()メソッドの違いは何ですか?

()を実行:タスクのRunnableをタイプにのみ実行することができます。

提出():タスクのRunnableを、呼び出し可能なタイプを実行することができます。

タスクの呼び出し可能なタイプは、戻り値を得るために行われ、Runnableをなしリターン値を実行することができます。

 

22. Javaプログラムはどのようにマルチスレッドの安全な動作を確保するには?

方法の一つ:などのJava utilの同時下層階級としての安全クラスを、使用して...

オプション2:自動ロック同期。

方法3:手動ロックロックを使用してください。

マニュアルロックの典型的なJavaコードは次のとおりです。

ロックロック=新しいReentrantLockの();

ロック。ロック();

{試します

..システムのうちのprintln( "ロックを取得");

}キャッチ(例外e){

// TODO:例外を処理

} 最後に {

..システムのうちのprintln( "ロック解除");

ロック。ロック解除();

}

 

23.同期マルチスレッドのロック・エスカレーションの原則とは何ですか?

ロックのエスカレーション原理を同期:ロックオブジェクトのヘッド内部オブジェクトは、スレッドIDの最初の訪問では、フィールドがスレッドIDが空である、JVMがバイアスされ、ロックを保持させ、そのスレッドIDに設定するスレッドID、それは再入力する時期最初にそれが正常でない場合は、そのスレッドIDとスレッドID一貫したは、一貫性のある場合は、あなたが直接このオブジェクトを使用し、そうでない場合することができ、その後、アップグレード偏ったロックは、一定回数の後に、所定の回数のスピンサイクルを介して取得するためのロック、軽量ロックであるかどうかを判断それはヘビー級軽量のロックロックをアップグレードされます、あなたが使用したいオブジェクトを取得するには、このプロセスは、同期ロックのアップグレードを構成しています。

アップグレードロックの目的:ロック・エスカレーションは、パフォーマンス上のオーバーヘッドを最小限に抑えるために持参するロックです。同期ヘビー級、その後ロックロック方式をアップグレードするために軽量にアップグレードバイアスされ、ロックを使用するJava 6の実装の最適化の後、このようにロック性能を減少させることは、消費をもたらしました。

 

24.デッドロックとは何ですか?

両方が排他ロックスレッドAを保持し、排他ロックを取得しようとすると、スレッドBは、排他ロックBを保持し、の排他ロックを取得しようとする場合をB、AB 2つのスレッドが互いを保持する必要性に起因する発生します閉塞を発生し、我々はデッドロックと呼ばれるロック、。

 

25.どのようにデッドロックを防ぐために?

使用することのtryLock(長いタイムアウト、TimeUnitでユニット)法(ReentrantLockの、ReentrantReadWriteLock)、タイムアウトを設定し、タイムアウトがデッドロックを防ぐ終了することができます。

Javaのを使用してみてください。Utilの。代わりに、独自の手書きロックの同時並行クラス。

ロックの粒度の使用を最小限に抑え、同じロックいくつかの機能を使用しないようにしてください。

同期コードブロックを最小限に抑えます。

 

26. ThreadLocalのそれとは何ですか?使用シナリオは何ですか?

変数の各使用のためのThreadLocalのスレッドは、独立変数のコピーを提供するので、各スレッドが独立してコピーを対応する他のスレッドに影響を与えることなく、そのコピーを変更することができます。

古典的なシナリオでは、データベース接続とセッション管理で使用THREADLOCAL。

 

基本原理を達成するための同期について27話?

monitorenter / monitorexit命令の組によって達成される同期、モニタオブジェクトは、基本的ユニットを同期化されます。Java 6の前に、理由ユーザモードカーネルモードを切り替える必要があるため、内部モニタ・オペレーティング・システムミューテックスに完全に実装され、同期動作は、未分化ヘビー操作は、パフォーマンスが非常に低いことです。ロック(偏ったロック)、ロック・軽量のバイアス:しかし、Java 6の、Java仮想マシンは、多くの場合、三つの異なるロックと言われる三つの異なるモニターの実装を、提供し、大幅に改善を行ったとき大幅に性能を向上ヘビーロック、。

 

違い28が同期してその揮発性とは何ですか?

揮発性改質剤は、可変であり、同期が変更されたクラス、メソッド、コードセグメントです。

可視性とアトミック変数を確保することができ、同期や修正、揮発性、視認性は、それが原子性を保証するものではありません、変数を変更達成することができます。

同期閉塞スレッドを引き起こす可能性があり、揮発性が閉塞スレッドが発生しません。

 

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

これは、ブロックをロックする、クラス、メソッドに同期させることができ、ロックは、ブロックをロックします。

手動で取得すると、使いやすいロックを解除することなく、同期、自動的にロックを解除します異常、デッドロックが発生することはありません。不適切使用した場合、ロックは独自のロックを必要とし、ロックを解除し、UNLO​​CKない()死亡につながるロックを解除するにはロック。

ロックによってロックを取得するために、成功せずに知っている、それは行うことはできません同期することができます。

 

30.同期とReentrantLockの違いは何ですか?

初期の実装がReentrantLockのに比べて、比較的非効率的な同期、ほとんどのシーンは全く異なる性能のですが、Java 6にDUIは、多くの改善があったに同期させています。

次のように主な違いは次のとおりです。

ReentrantLockのは、より柔軟な使用していますが、アクションでロックを解除する必要があります。

ReentrantLockの手動で取得してロックを解除し、手動で解除し、ロックを開くことなく同期しなければなりません。

のみReentrantLockのロック・ブロック・コード、および修正方法は、同期コードのブロックなどのために使用することができます。

変数揮発性フラグは、コンパイラ最適化されないであろう。マークは、可変最適化コンパイラを同期させることができます。

 

アトミック原則について31話?

効率を高める大幅同期の高コストを回避するように、アトミック操作を保証するために、原子CAS(比較およびWWAP)、揮発性およびネイティブメソッドの主な用途。

 

呼び出し元のスレッド静的ブロックで32 Threadクラスのコンストラクタ、

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

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

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

コンストラクタ2)スレッド1静的ブロックはrun()メソッドは、そのスレッド1を起動されたスレッド1、スレッド2と呼ばれています

 

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

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

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

 

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

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

1)高い同時、短いビジネスタスク実行時間、スレッドプール内のスレッドの数が+1還元スレッドコンテキスト切り替えCPUコアの数に設定することができます

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

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

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

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

おすすめ

転載: www.cnblogs.com/Bkxk/p/11577517.html