同期ロックのアップグレードはどのような原則でありますか?

ローからハイへのロックレベル:

ロックなし - >偏ったロック - >軽量ロック - >ロックヘビー級

 

サブレベルの理由をロック:

以前の最適化、sychronizedヘビー級ロック(悲観的ロック)、スレッドの状態は非常にシステムリソースを消費して切り替えるように、のnotifyAllを待機を使用して通知し、スレッドが中断し、ウェイクアップ間隔が非常に短いですが、これは資源や衝撃性能の無駄ではありません。だから、最適化されたsychronizedキーワードにJVM、ロックにノーロックは、ロック軽量、重量級のロック状態をロックする傾向があります。

 

ロックなし:リソースのロックなしには、すべてのスレッドがアクセスしていないと、同じリソースを変更するが、一つのスレッドだけが成功を変更することができ、同時に、他の変更は、スレッドが正常に変更されるまで再試行し続けます失敗する可能性があります。

 

偏ったロック:オブジェクトコードが常に同じスレッドで実行され、競争の複数のスレッドが存在しない場合、自動的にそれ以降の実装でロックを取得スレッドは、ロック獲得は、パフォーマンス・オーバーヘッドをもたらし減らします。バイアスされたロックは、バイアスに別のスレッドがバイアスされ、ロックが解除されます競争しようとした場合にのみ、バイアスされ、ロックの解除を求めていない最初のロックスレッドを指します。

バイアスされたロックの失効は、何バイトコードが実行されていない必要があり、最初のスレッドがある時点でバイアスされたロックを懸濁した後、オブジェクトはロックがロックされているかどうかを決定することです。スレッドがアクティブでない場合、ヘッドオブジェクトは非ロック状態に設定され、バイアスロックを撤回します。

スレッドがアクティブである場合、ステータス軽量ロックにアップグレード。

 

軽量ロック:軽量ロックは、ロックがバイアスされたロック時間である場合、第二のスレッドBによってアクセスされ、それは軽量バイアスロックロックにアップグレードされ、この時間は、スレッドBはスピンの形で試みることを意味ロックを取得し、スレッドは、パフォーマンスが向上し、ブロックされません。

現在は一つだけ待機しているスレッド、スレッドがスピンで待機します。スレッドがすでにロックを保持している場合はスピンで別のスレッド、しかし、そこに今回は第三スレッド、光を訪問し、しかし、スピンの一定数以上、軽量ロックはヘビー級ロックにアップグレードされる時期ミドルロックはヘビー級のロックにアップグレードされます。

 

ヘビー級のロック:ロックの取得を待機している他のすべてのスレッドがブロッキング状態になります後に一つのスレッドがロックを獲得すること。

モニターによってオブジェクト内のヘビーロック基礎となるオペレーティングシステムミューテックスロックの実装に依存しているの(モニター)を達成するために、モニターと性質は、スレッド間のオペレーティングシステムのスイッチングは、スイッチングコストが非常にあるカーネルモードために、ユーザーモードから切り替える必要があります高いです。

 

ロック状態の比較:

 

バイアスされたロック

軽量ロック

ヘビーロック

該当シーン

同期ブロックを入力するだけのスレッド

多くのスレッドが、しかし、競合は発生しません:複数のスレッドがロックふらつきに同期ブロックが、スレッドを入力するため、競合しなかったが

ロック競合の状況が発生しました:複数のスレッドが同期ブロックとロック競合を入力してください

自然

同期操作をキャンセル

代わりに、同期CASの排他的な操作

ミューテックス同期

利点

(CASは、第一付勢されロック動作を取得し、それ以降のスレッドID以外場合にのみ必要)がブロックされていない、高効率

ブロックしないでください

CPUは枯渇しません

短所

該当シーンがあまりにも制限されています。競争が発生した場合は、余分な偏ったロック失効消費があるでしょう

CPU時間の枯渇はロックを取得できません

閉塞、コンテキストスイッチ、ヘビー級操作は、オペレーティングシステムがリソースを消費します

 

パートの抜粋:

http://www.jetchen.cn/synchronized-status/

https://www.liangzl.com/get-article-detail-17940.html

 

       


Javaのインタビューの質問の概要は、いつもあなたが立ち往生しています!

 

おすすめ

転載: www.cnblogs.com/ConstXiong/p/11687975.html