そして、同期の使用とロックの違い

--- ---復元コンテンツ始まります

1.スレッドとプロセス

>プロセス - - >プログラムプログラムは、少なくとも一つのスレッド内の少なくとも1つのスレッドを必要とするプロセスを必要とします

スレッドは、プログラム実行フローの最小単位であり、プロセスは、システムリソースの割り当ておよびスケジューリングの独立したユニットです。

2.Threadのいくつかの重要な方法

①start()メソッド:あなたはこのスレッドを開始する前に

②stop()メソッド:スレッドの終了を強制

③join():スレッドの終了を待ちます

④sleep()メソッド:待機中のスレッド

⑤run()メソッド:このスレッドの直接実行runメソッド(スレッドの呼び出しは、(スタート)メソッドが実行を実行します、runメソッドは、runメソッド、直接呼び出し元のスレッドを実行するスレッドスケジューラによって区別されます)

中断(待機)と通知()メソッドは、それぞれのオブジェクトであり、スレッドとスレッドを再開:注意

差異待ち()と睡眠()は次のとおりです。待って()は、オブジェクトのロックを解除し、睡眠()は、オブジェクトのロックを解除しません

3.スレッド状態

5件の大規模な状態のスレッドがあります。

新しいスレッドオブジェクトの前に、起動して呼び出すことはありませんでした:①新しい状態を

②準備状態に:startメソッドは、睡眠中のレディ状態、他の倍のスレッド回復を入力して、状態を一時停止するに呼び出された後、準備に入ります

③実行中の状態:スレッドが現在のスレッドを実行するように設定されているが、実行方法を開始します

④ブロックされた:スレッドが中断されます。例えば、睡眠メソッドを呼び出した後

⑤死の状態:スレッドの実行の終わり

4.ロックタイプ

①再入可能ロック:実行オブジェクトのすべての同期方法は、再びロックを得ることはありません

ロックを解除することができます②:割り込み待ちのロックプロセスを取得します

③公正ロック:スレッドの取得を待つことによって運ばロックを取得するために待っている時間が、長い時間を待ってロックへの優先アクセスへの力を持っています

④読み書きをロック:あなたが一緒に読むことができたときに読んで読んで、二つの部分の処理に分割する際のリソースへの書き込み、マルチスレッド、書く時間が同期を記述する必要があります

 

各オブジェクトはロックとして使用することができるJava(登録商標)、4つのレベルがあり、ロックは、に分割重いへライターの順序に従って:いいえロック、軽量、ヘビーロックをロック、ロックする傾向があります。各オブジェクトはロックのみアップグレードすることができ、ロックのレベルをダウングレードすることはできません高いスレッド間ロック競合、より強い、と、ロックフリースタートです。

配列型はまた、(記憶された3つのワードである場合、Javaオブジェクトと同様のロック機構は、すべての情報のロックは2つのワード(32ビットJVM 1ワード= 32ビット)メモリ・オブジェクト・ヘッダと、Java(登録商標)のオブジェクトヘッダに記録され、密接にヘッド、ロックの配列の長さ)、ハッシュ値が記録されたオブジェクトヘッダ、ポインタGCの年齢、状態、スレッドの所有者を格納するメタデータのタイプを必要とします


 

同期化され、ロックの違い

カテゴリ 同期 ロック
存在のレベル JVMレベルでのJavaのキーワード これは、クラスであります
ロック解除

1.ロックスレッド実行の同期コードを取得するために、ロックが解除されます

2.スレッドの実行例外が発生すると、JVMは解放し、ロックをスレッドします

最終的には、ロックを解除する、またはスレッドのデッドロックが発生する可能性がある必要があります
ロック取得 スレッドがロックを取得すると仮定し、スレッドがブロックされている場合に、Bのスレッドが待機する、待つようにBのスレッド 場合に応じて分割し、ロックが複数のロックを取得する方法を持って、あなたがロックを取得しようとすることができ、スレッドが待機する必要がないかもしれません
ロック状態 判断できません あなたは判断することができます
ロックタイプ リエントラント、中断することができない、不公平 リエントラント、それは決定することができ、公正(両方とも利用可能)も
演奏 同期の少量 同時多数

ロックインタフェースメソッド

①lock():ロックが次にある場合にロックを取得するためには、一時的な使用のために待機します

②unlock():ロックを解除

③trylock():ロックが占有されると、偽の真のリターンはそれ以外のロックを取得場合は戻り値の型は、ブール値であります

④tryLock(長い時間、TimeUnitで単位):のtryLock(と比較して)は、時間パラメータを待っていることを確実にするために時間制限が与えられ

⑤lockInterruptibly():ロックを取得する方法スレッドがロックを獲得するために待機段階に入った場合は、あなたが何かを行うには、このスレッドを中断することができます

ロックの他の種類の基本となる実装

 

同期:ソースの表示は、バイトコード命令にマップされた同期を知ることができ、命令を引っ張って増加し:. monitorenterとmonitorexitスレッドは命令のmonitorenter実行を検出すると、彼はロックを取得しようと、ロックカウント+ならば、ロックが取得されます1それはmonitorexitに遭遇したとき、それは再入可能なロックであるため、それはロックが取得されていない場合、ロックカウント決意ロックケースを使用する必要があり、その後、-1のロックカウントをブロックし、カウンタがゼロであるとき、それがあろうロックを解除します。

二つの同期ロック解除機構は、一方の放出が実行終了し、別の例外送信である、仮想マシンが解除され、第二monitorexit図例外処理が実行される意味、ライン13に、GOTO命令を発生している場合に通常の操作では19行の実行の終わりにジャンプします

ロック:同期は悲観的ロックされ、奪われての恐怖のために、すべての時間を仕事と下部をロックするために自分自身を黙っCAS楽観的ロックの実施形態がされ、外の世界が奪われた場合には関係ありません、主に地上階に、非常に楽観的に再取得揮発性およびCAS実装

注意:可能な限りロックを使用して同期使用する予定なし

JDK1.6は〜、それは、最適化の多くを行っsynchronized16,7年的时候jdk1.7である場合には

6.synchronized役割

他のスレッドに共有変数の視認性を確保しつつ、同期メソッドまたはコードのブロックは、クリティカル領域に入ることができる唯一のスレッドを実行すると同時に保証することができます

同期JDK1.6はヘビーロックの前に、(モニタ)が内部オブジェクトを介して達成されるロックモニターと呼ばれるが、モニタがミューテックスのロックが達成基礎となるオペレーティング・システム、オペレーティング・システムの性質に依存していますこれは、スレッド間の切り替えを実現モードカーネルためにユーザモードからの移行を必要とします

最適化:

①スレッドがスピンとスピン適応性

Javaスレッドが実際にカーネルの上にマッピングされているので、コストおよびJDK当局は多くのスレッドがロックを取得するために非常に短い期間で、ロックを待っている間ことがわかったスレッドは一時停止と再開が大幅に影響します彼らはスレッドを待っているとき、スレッドが中断する必要があるが、彼は目的のないサイクルをさせていない、一般的にこのように、大幅に性能向上をスレッド切り替えのオーバーヘッドを避け、10回に設定してください。適応スピンは、スピンはそれが10倍程度のスピンを固定されていない、学習能力を与えられています。彼はそれがスピンを調整し、その前に例のスレッドをスピンすることができます。でもスピンせずに直接ハング

②ロックの除去

不要な同期を排除ロックしても、必ずしもあなたが排除コードロックを書くという意味ではありませんここにロックを排除し、コンパイル時に削除されています。

たとえば、StringBufferの安全クラスで、この方法は同期されますが、分析は何のスレッド安全性の問題がないことを知ることができる、それがこの同期ロックを排除する追加、簡単な方法のアペンド文字列の連結を行い、

③ロック粗大化

同期使用している場合、同期ブロックを小さくすることが、すべては、大きなオーバーヘッドを回避するために、なぜそれが大胆な注意を払います。どちらのStringBufferのappendを同期する必要があるたびに、それは最初と最後の追記に粗大化をロックすることができ、文字列を連結

④軽量ロック

⑤バイアスロック

 

---終わり---コンテンツを復元

おすすめ

転載: www.cnblogs.com/xiaoyinger/p/11614587.html