基本原理を同期

図1に示すように、一般的な同期方法は、ロックオブジェクトの現在のインスタンスであります

図2に示すように、静的な同期方法は、現在のクラスのロックはクラスオブジェクトであります

図3に示すように、ブロック同期方法は、オブジェクトのロックは、ブラケットの内側にあります

基本原理を同期:

入口と出口モニターオブジェクトの実装上のJava仮想マシンの同期(同期)、それは(明確な指示monitorenterとブロックを同期さmonitorexit付き)明示的な同期であるか暗黙の同期が真であるかどうか。

シンクブロック:monitorenter同期コードブロックの開始位置にmonitorenter命令monitorexit命令同期コードブロックの終端位置に、JVM各々がそれに対応monitorexitを有することを確認する必要があります。任意のオブジェクトは、それにモニターが関連付けられている、と開催された後、モニタは、彼がロックされます。Monitorenter命令スレッドを実行するために、モニタに対応するオブジェクトの所有権を取得しようとし、すなわち、ロックオブジェクトを取得しようとします。

オブジェクトヘッダ:マーク・ワード(マーカーフィールド)、クラースポインタ(ポインタ型):オブジェクトヘッダホットスポット仮想マシンはデータの2つの部分を含みます。オブジェクトは、そのクラスのメタデータへのポインタであるクラースポイントは、仮想マシンは、オブジェクト・クラスのインスタンスであるポインタによって決定され、マークWordのロックと軽量を実現することであるオブジェクト自体に格納された運転データキーロックバイアス。

マークWordは:そのようなハッシュコード(ハッシュコード)として、ランタイム・データ・オブジェクト自体を格納するために、GC世代年齢ロック状態フラグスレッドはロック保持し、スレッド偏向ID、タイムスタンプなどバイアスを。Javaオブジェクトは、最初の2つの一般的なマシンコード(32ビット仮想マシン、マシンコードが4バイト、すなわち32ビットに等しい)が、オブジェクトが配列型である場合、仮想マシンは、JVMができるので、それは、必要3台のマシンコードで占めJavaオブジェクトのメタデータ情報のサイズを決定するが、配列の長さを記録するためにそれを使用して、メタデータからアレイに配列のサイズを確認できなかったことにより、Javaオブジェクト。

Monior:同期メカニズムは、それが内部ロックまたはロックモニタと呼ばれています。モニターは、スレッドプライベートなデータ構造であり、

一意モニタは、スレッドがロックを所有有する所有者フィールドに格納されるオブジェクトのそれぞれは、ロックされ、モニタ(MarkWordモニタの開始までロックワードオブジェクトヘッダ点における)に関連付けられている識別し、これは、ロックがあることを示しスレッド占有

 Java仮想マシンが同期するように最適化されています。

4つのロックの状態、ロックなしの状態、ロックする傾向があり、軽量かつヘビー級ロックロックがあります。競争のロックで、あなたはヘビー級のロックをアップグレードした後、偏った軽量ロックをロックするロックからアップグレードすることができますが、ロックのエスカレーションが一方向である、それはローからハイにのみをアップグレードすると言うことです、ロックは表示されませんヘビー級のロックにダウングレードし、我々はそれ以前詳細に分析している、我々はバイアスされ、ロック・軽量ロックとJVMを最適化するための他の手段が表示されます。

バイアスされたロック

バイアスされたロックは、研究はほとんどの場合、何のマルチスレッドロックだけでなく、競争力がないことが判明した後、それは、ロックの動作を最適化するための手段であり、Javaの6は新しいロックの後に追加されますが、常に同じスレッドで何度も取得しますしたがって、同一のスレッドがロックを獲得低減するために、バイアスロックを導入する費用(CASは、いくつかの、時間のかかるを含むであろう)。バイアスされた固定コアアイデアは、スレッドがロックを取得した場合、ロック、すなわち、バイアススレッドが再びロックを要求するときにマークワード構造は、また、バイアスされたロック構造となるモード、および無さらに同期を入力することです従って、プログラムの性能を提供するロックの適用に関する操作の多くを排除する、ロックを取得する処理。だから、ロック競合のための機会がない、優れた最適化の結果をロックバイアスされ、結局、同じスレッドロックを適用し、繰り返し同じである可能性が高いです。このような状況は、アプリケーションごとにスレッドが異なっているので、この場合、バイアスされ、ロックを使用すべきではありませんロックする可能性があるので、しかし、場所のロックのためのより激しい競争は、あなたが注意を払う必要があり、そうでなければ無駄になる、失敗時にバイアスをロックそれは、障害発生後にロックする傾向があり、すぐにヘビー級のロックが、軽量ロックへの最初のアップグレードを展開しません。

軽量ロック

ロックする傾向が失敗し、仮想マシンはすぐにヘビー級のロックにアップグレードしません、それは(1.6を追加した後)軽量ロックと呼ばれるツールの使用を最適化しようとし、その後、マークWordの構造は、光になった場合ロック構造の順。「ロックのほとんどは、全体の同期サイクルには競争がないと、」プログラムのパフォーマンスを向上させることができ、軽量ロックに基づいており、これは経験的なデータであることに注意してください。同じ機会を同じ時間にアクセスするためのロックがある場合は、シーンの適応が交互に行われる軽量ロックが同期ブロックを機会スレッドことを理解する必要があり、それは軽量の重量級のロックロックインフレにつながります。

スピンロック

軽量ロックが失敗した後、実際のスレッドを避けるために、仮想マシンは、オペレーティングシステムレベルでハングアップするだけでなく、スピンロックとして知られている最適化するための手段。この状態は、それらが直接オペレーティングシステムレベルのスレッドは、スレッドを切り替えることが、結局、オペレーティングシステムを無駄にすることができる掛けられている場合は、ほとんどの場合、ロック時間を保持しているスレッドは、長すぎるではありません、ユーザーベースから変換する必要あり状態間のコアの状態遷移は、スピンロックが近い将来に仮定しますので、時間コストが比較的高く、比較的長い時間を必要とし、現在のスレッドがロックを獲得することができますので、現在の仮想スレッドの機会は、ロックを取得したいです(理由はスピンとしても知られている)、いくつかの空のサイクルを行い、一般的ではないが長すぎる、それはあなたがロックを取得する場合、彼らは成功したクリティカル領域を入力し、数サイクル後、50サイクルまたは100サイクルかもしれません。あなたがロックを取得できない場合、それは、オペレーティング・システム・レベルのスレッドがハングとなり、これは、効率を向上させることができ、このように、確かに、スピンロックを最適化する方法です。最後に、それだけでロックされたヘビー級にアップグレードすることができます方法はありません。

ロック排除

ロックを除去する別の仮想マシンロック最適化され、この最適化は、より徹底し、Java仮想マシンのJITは、時間をコンパイル(またリアルタイムコンパイルとして知ら約初めて実行するときにコンパイルされるコードの単純な片として理解することができます)、ロックコンテキストの操作をスキャンすることで、ロックは必要ありませんこの方法を排除し、共有リソースの競合のない除去がないことができ、それはStringBufferの者は、同期方法を追加して、ロック要求無意味な時間を節約するが、方法で追加することができますStringBufferのは、ローカル変数に属し、他のスレッドによって使用されることはありませんので、何StringBufferのシーン共有リソースの競合がないことができ、JVMは自動的に排除ロックされます。

 

再入を同期:

ときに、設計からmutexは、スレッドがオブジェクトロックの別のスレッドが保持している重要なリソースを操作しようとすると、ブロックされた状態になりますが、重要なリソースの要求スレッドは、オブジェクトが再び自分自身をロックし保持しています、スレッドがオブジェクトに同期メソッド呼び出しを呼び出している間リエントラントロックケースに属する、成功する要求は、Javaで同期さ基づい原子内部ロック機構は、従って、リエントラントである内で他の方法でそれら同期方法の後に、それは、再入に同期され、許可されているオブジェクトのロックを取得するために再度スレッドオブジェクトのロック要求です。

 

Benpian参照します。http://blog.csdn.net/javazejian/article/details/72828483 locationNum = 5&FPS = 1?

http://www.cnblogs.com/pureEve/p/6421273.html

http://www.cnblogs.com/paddix/p/5367116.html

おすすめ

転載: www.cnblogs.com/sunny-miss/p/11794156.html