1.何がマルチスレッド化されましたか?
マルチスレッドは、複数のスレッドが、システムの効率を向上させるために、タスクを完了するために並列に動作することを可能にします。スレッドは、それらが実装された、同時に複数のタスクを完了する必要があります。
2.理解マルチスレッド
我々はいくつかの重要な概念を見つけるために、マルチスレッド化を理解する前に!
上に示した:私達のプロジェクトのメインメモリを有し、メインメモリは、オブジェクトヒープと同様に、我々の共有変数、メソッド領域内に格納されています。
3.作業プロセススレッド
私たちは、スレッドが共有変数のコピーのメインメモリコピーがワーキングメモリに格納され、かつ協調的なアプローチは、スタック針エリアを生成すること、およびスタックへの参照(ポインタ)、私たちのためにワーキングメモリを開きますスレッドを開くたびに。
共有変数のスレッドの変更操作が実行中にメモリで作業する場合は、その場合には、我々は戻って、メインメモリへの変数の変更を書き込みます。
4.マルチスレッドの問題によって引き起こされます
私たちは、シナリオをシミュレート:
そこに同じチケットで10人のユーザが、システムわずか8票であり、各ユーザは、メインメモリがプロセスで、ワーキングメモリ8票にコピーされたときに開いて独自のスレッドながら、投票数かどうかを決定しますこのケースを満たし、10件のスレッドが票を操作しなければならないため、満足させるために決定されています。
ユーザの操作は、= 8-1 = 7、バックメインメモリにライトデータを投票します。
2つのユーザ操作の後、ユーザは2つのローカルメモリ8、変性票= 8-1 = 7投票、バックメインメモリへの書き込みを継続し、
これが続く、我々はオープンスレッド同時10人のユーザーの場合、投票の最後のメインメモリは7でなければならないことを前提とし、10人のユーザが、実際には非常に危険な場面での状況を、成功した投票が売られていています事!
5.マルチスレッド特性
注文:オーダーコードで実行されるプログラムの実行シーケンス。
可視性:複数のスレッドが同じ変数にアクセスすると、スレッドはこの変数の値を変更し、他のスレッドが直ちに変更された値を見ることができます。
別のCPUに2つのスレッド場合は、表示されませんでした、それはiの値を肯定する前に、まだある、変数のスレッド1、スレッド1は、メインメモリ、スレッド2をリフレッシュするためにスレッドを変更しなかったiの値を変更し、私が使用してこれは問題の可視性です。
アトミック:すなわち、1つまたは複数の操作またはすべての操作を行うと、プロセスは、任意の因子の実行を中断されない、またはそれが実行されません。
実行中のプログラムにコンパイル、プログラムはいくつかの並べ替えを通過します、ソースコード - >コンパイラの最適化、リオーダ - > ILPの並べ替え - >メモリシステムを並べ替える - >命令シーケンスの最後の実行、
その我々のコードでは、並べ替えの一連た後、コードは私たちのために書く可能性と矛盾しているが、我々はその私たちのオペレーティングシステムを保証します
私たちのソースコードの結果と一致して実行される命令の最後のシーケンスは、我々は、オペレーティングシステムは、シングルスレッドの秩序であることを確認することができます。
6.どのようにマルチスレッド化によって引き起こされる問題を解決するには?
とき私は、複数のスレッドを使用する必要がありますか?
レース条件:実行の決定は、次の満足するかどうかをチェックした後。
方法の一つ:ロック
各スレッドは分離されていることを保証し、スレッドロック同期だけ方法1.同期モニターロックは、実行を入力するように時間を要します
スレッドは、この方法の最後のロックを解除したとき、他のスレッドは、スレッドが実行を継続するために、他のスレッドのロックを解除するまで中断されます。順序、可視性、アトミック:上記の3つの特性ことを保証することが可能です。
JMMは、メモリアクセスの仕様、整然とした、可視性、原子、8つのルールの合計を定義し、我々は、インターネット情報のJMM詳細なルールを理解することができます。
同期メカニズム:
ロック同期化を監視します
ディスプレイのロックReentrantLockの、ReadWriteLock
アトミック変数のAtomicInteger、AtomicLong、AtomicBoolean
揮発性
質問:どのように同期の実装に遭遇した特定の問題を選択するには?
JDK1.5後にロックを監視、パフォーマンスが大幅に改善されており、更新のJavaバージョンに最適化された、ロックが同期して自動的にロック及びアンロックすることができます。
私たちは、簡単なミスがデッドロックにつながる、手動で表示ロック解除をロックする必要があり、ロック。
パフォーマンスを考えると、それは機能を考えるとき、ディスプレイのロックを使用することが推奨され、モニターロックを使用することが推奨され、ロック画面はカスタマイズする多くのオプションがあります。
方法2:閉じスレッド
スレッドとは何閉じていますか?
変数のデータ共有にアクセスすると、多くの場合、あなたはそれを避けるために、同期の方法を同期する必要があるデータを共有していないだけで、シングルスレッドのデータアクセスで、同期が必要とされていない場合、この技術は、スレッドがクローズと呼ばれています。
スレッドが閉じている場合:クロージャ1スタック:スレッドが針糸の使用にホッピングローカルスタック変数を生成する方法が閉じています。
2.ThreadLocal - >現在のスレッドのみを使用することができます。
方法3:不変オブジェクトはスレッドセーフでなければなりません。
ベストプラクティス:使用するオブジェクトは、スレッドセーフでスレッドセーフ達成することです。クラスjava.util.concurrentパッケージ。