Javaの並行アート(4)ロック状態とコントラスト

ロックのエスカレーション

JavaのSE1.6の得るためとリリースロックがパフォーマンスもたらした消費量を削減する、Javaで「バイアスロック」と「軽量ロック」の導入
SE 1.6、ローからハイに4州レベルの合計でロック再びある:何も状態は、ロック状態、ロック状態、軽量かつヘビー級ロック状態に傾向があり、これらの状態はエスカレート状況と競合します。ロックはアップグレードできますが、バイアスロックへのロックのエスカレーション空腹缶ダウングレード後に軽量ロックにバイアス手段をダウングレードすることはできません。このロックはアップグレードが、本羅をダウングレードすることはできませんが、目的は、取得と解放ロックの効率を向上させることです

バイアスされたロック

ほとんどの場合、マルチスレッドロックは、競合が、常にスレッドがロックを獲得し、バイアスされたロックの導入コストを低減することを可能にするために、同じスレッドの数倍から得られるだけでなく、存在しません。
スレッドがロックアクセスシンクブロックを取得すると、スレッドはロック及びアンロックするためにシンクブロックの入口と出口にCASを必要としない後に、記録ヘッドとスタックフレームストアロックバイアススレッドIDでオブジェクトをロックします現在のスレッドがバイアスロックを指している場合、単に試験にマーク語の先頭は、メモリ内のオブジェクト。
テストが成功した場合、それは、スレッドがロックを獲得したことを示しています。
テストが失敗した場合は、(ロック付勢されている電流を示す)1に設定されているバイアスロックのアイデンティティに再テストマーク言葉にする必要があります:
設定されていない場合は、CASの競合ロックを、
セット、CASオブジェクトヘッドを使用してみた場合現在のスレッドにロックポイントを付勢。
ここに画像を挿入説明
Java6の中とJava7でバイアスされ、ロックはデフォルトで有効になっていますが、アプリケーションは数秒を開始した後にのみ有効になります。必要であれば、JVMは、遅延パラメータ-XX :: BiasedLockingStartupDelay = 0を閉じるために使用されてもよいです。

-XX:あなたは、通常の状況下での競争状態にあるすべてのロックでアプリケーションを判断した場合は、偏ったロックJVMパラメータでオフにすることができます - UseBiasedLocking = falseの場合、プログラムはデフォルト軽量ロック状態になります。

軽量ロック

(1)軽量ロック
シンクブロックを実行する前に、スレッド、JVMは、現在のスレッドとマークWordがロックレコードにコピー・オブジェクトのヘッダ内のロックのスタックフレームに格納するためのスペースを作成します。
スレッドは、記録されるロックするCASオブジェクトマークWordの交換用ヘッドポインタを使用しようとします。成功した場合は、現在のスレッドがロックを取得し、それが失敗した場合、別のスレッドのロック競合を表し、彼らはロックを取得するためにスピン現在のスレッドを使用しようとする
(2)軽量ロックを解除
するとき、ロック解除軽量、マークWordの変位アトミックCAS操作の使用オブジェクトへのヘッドバックを交換する、成功した場合、それは競争が発生していないがあることを意味します。それが失敗した場合、競争があり、現在のロックを表し、ロックがヘビー級ロックに展開されます
ここに画像を挿入説明
ヘビー級ロックはそれをロックするためにアップグレードした後スピンは、(例えば取得するように、ロックのスレッドがブロックされている)、不要なスピンを避けるために、CPUを消費しますので、これは、状態軽量ロックに復元されることはありません。ロックがこの状態にあるときは、他のスレッドがロックを取得するビューがスレッドがこれらのスレッドを起動しますロックを保持しているロックを解除する際に、ライブにブロックされます、スレッドは勝利の戦いロックの新ラウンドを目覚めさせます

長所と短所ロックの比較

ロック 利点 短所 該当シーン
バイアスされたロック ロックと追加消費のロックを解除しない、差分ナノ秒があるのみと比較して、非同期メソッドを実行します スレッド間ロックの競合がある場合は、追加のロック失効消費をもたらします これは、シーンのシンクブロックにアクセスするために一つのスレッドだけに適用されます
軽量ロック スレッドには、競争をブロックする手順の応答速度を改善しません スレッドを競合するロックを取得することはまだできない場合は、スピンを使用すると、CPUを消費します 応答時間を求めて実行すると、非常に高速なシンクブロックであります
ヘビーロック 競争は、スピンスレッドを使用していません。これは、CPUを消費しません。 スレッドは、ブロックされたカーネル変換部にユーザーモードからスレッドを起こしている、資源の消費 特定のシンクブロックの長い実行速度を求めます
公開された24元の記事 ウォンの賞賛1 ビュー547

おすすめ

転載: blog.csdn.net/qq_45366515/article/details/105126691