宝の地図、軽量ロックによって引き起こされる問題の束は、(同期ロックのアップグレードを)困惑〜


背景

同期アップグレードの原則を見てみましょう、結果は、このような宝の地図を掘っ:
ここに画像を挿入説明
不可解な、軽量ロックの最後が解除され、なぜここに他のスレッドを覚ますがありますか?ロック解除後のヘビー級のロックがここで失敗した多くの場所に展開されますか?

最後に、人間の姿を描くことを学ぶ
します。https://blog.dreamtobe.cn/神のブログのURL
ブログ署名を:

私は、無反省の人生を持つことになり 、将来的に、我々は何かを達成しなければなりません。
私の人生は、将来的に後悔しないように、我々は成功しなければなりません。

残念ながら、

ロックステップをロックすると、オブジェクトへの少ないロック所有者のポインタでバイアスされたときの図は、軽量に思えるが、私は主なものは、三段階はそれを標識することだと思います。

場合は、スレッド1のリリース、なぜ、失敗はそれらのスレッドを目覚めさせるときに一時停止しますか?

それが失敗した場合ので、その後、ロックが膨張されています。

ポインタCASが失敗したときに実行中のスレッドは、スレッド2が登場し、この時間は、スレッド2を交換する場合は、すでにこの時点で一定の成功を収め、スレッド2に達していない場合、スレッド2スピン操作はので、展開は、ロックがヘビー級にロックするようになります、自体(スレッド2)してもよいことは中断されます。

ヘビー級のロックは、ヘビー級のロック・モニターを指しマーク・ワードにつながるマークワードロックオブジェクトの値を変更するので、スレッド1は、CASを操作しようとすることで解放されるとする一方、スレッド1つのリリースには、ヘビー級のロックに展開されてきた場合には変位マーク言葉は、彼らはヘビー級ロックで競争するために再び目を覚ます必要があるので、失敗したバックオブジェクトマークワードに切り替えます。

しかし、私は、この時点で、スレッド2のスピンプロセスは(まだスピンの最大数に達していない)ヘビー級ロックに展開されませんので、スレッド1がリリースされている場合は、この時間は、それが正常に解除することができた場合、例外があるかもしれないと思います、およびスピンスレッド2もまだそれほどスレッドをウェイクアップしていない、中断されていません2

また、長い時間のよう、最終的には本の中で答えがまだありました。

この本の15ページの「Java並行プログラミングの芸術」で - 軽量ロックとフローチャートの拡大、答えを得ました

拡張フローチャート

軽量ロック

ここに画像を挿入説明

バイアスされたロック
ここに画像を挿入説明

なぜマーク単語をコピーしますか?

実際には非常に単純な、ロックに一緒に同期させ、この基本的な操作のロックを解除したくないので。

コピー対象マークワードが完了した後、JVMステップスイッチング動作は、ポインタ、プロセスのすなわち第1の矩形枠オレンジコンテンツを行います。
スタックポインタロックレコードに軽量ロックポインタのオブジェクトマークの言葉は、それが他のスレッドがオブジェクトのモニターがすでに使用されていることを知ることができるようにすることです、位置しています。
所有者の役割にオブジェクトマークワードポインタでロックレコードがロックされたオブジェクトの識別、プロセスの動作を引き継ぐことです。

CASによってまとめ

https://www.bbsmax.com/A/A2dmM7lbde/

質問?最終的には軽量ロックが二つ以上のスレッドまたは2つのスレッドが同じロックが拡大ヘビー級のロックを競うのですか?

ブログを見る前に、言及よりも如果有两条以上的线程争用同一个锁,那轻量级锁就不再有效,要膨胀为重量级锁,、しかし、2つのスレッドがヘビー級ロック拡張として命名することができます参照するために、上記の絵。

で本をチェックしてください「Java仮想マシンの深い理解、」私は、よく私はまったく同じ言葉で書かれたブログは、ほとんどがオーバーブックからコピー以上のように、右の推測ほどです。

同じロック、もはや有効ではない、軽量ロックの競合つ以上のスレッドが、ヘビー級のロックを拡張する場合には、フラグ値のロック状態は「10」となり、マーク・ワードは、ヘビー級のポインティングに保存されています(ミューテックス)ポインタ。

私は本当に、他のより良い答えは確かにこの行き止まり、右ここでは、曖昧ではないかもしれ発見していないので、参考文献は、参照として、来る一時、混乱のように、多くの人々がビューをサポートするブログ記事を参照してくださいと私A。

そこに競争があるが、競争の程度は非常に軽いです、通常は同じロック操作のための2つのスレッドがよろめき、または少し(スピン)をお待ちしております、別のスレッドがロックを解除することを軽量ロック。しかし、スレッドに加えて、別の第三の訪問中に、軽量ロックインフレヘビー級ロック、ロックヘビー級を一定回数、またはロック、スピンを保持しているスレッドよりも多くのロックスピンを所有しているときスレッドはCPUのアイドルを防止し、ブロックされています。

オリジナルリンクします。https://blog.csdn.net/choukekai/article/details/63688332

最後に、ここではかなり良いと言って重量级锁使除了拥有锁的线程以外的线程都阻塞,防止CPU空转。

要約:

私の知識は確かに2ですが、教科書はそれがあると理解されている時間のために、正当化されるべきと言うより:1がロックを保持して、3つのスレッド、スピン長いが(理由は、適応スピンを考慮に入れ、それを取ることはありませんでした裁判官が展開されなければならないので、サイレント)、第三のスレッド、そして今回自分自身を通知する仮想マシンは、このような状況は、長い時間のためのスピンを持つようにバインドされている、と我々はそれが道のスピンのn倍(デフォルト10ではありません知っています回)ロックを取得していない、あなたは終了しましたか?そうするためには、ロックを保護することです。

最後にとき拡大ヘビー級ロック?

  1. ロックを取得することはできません(デフォルト10回は、スピンロックの後に適応JDK1.6がある)スピンn回は、この時間は、二つのスレッドがあるはず
  2. 3つのスレッドは、1はロック、長い時間のためのスピン、第三のスレッドを保持し、この時間が展開されています
  3. このような状況であるため、軽量リリースロック時間、これは厳密にする必要がありますし、同じ第1条:現在のスレッド1のリリース、スレッド1の実行中に、スレッド2場合、スピンn回失敗しました、ハング自分自身、および故障時に拡大ヘビー級のロックのためにヘビー級のモニタポインタロックにマークワードポイントそれほどヘビー級ロックの拡大、スレッド1つのCASがrepalcedますマークワードマークワードの交換は反対しますので、非常に多くのブログは言いましたリリースが失敗したので、これは、ヘビー級のロックのように展開される前に失敗した拡張ヘビー級ロックした後、実際には、それは、間違っていますそこでここでは本質的に、またはスピンスレッド2故障原因は、最初にある、腫れ。

グローバルセキュリティのポイントは何ですか?

グローバル・セキュリティーがリリースロックする傾向がある時にリリースポイントを必要とし、世界の安全保障のポイントは何ですか?

この時点で実行されて何のバイトコードはありません

この時点で、任意のコードを実行されません

グローバルセキュリティポイント(安全ポイント):理解のグローバル・セキュリティ・ポイントは、基礎となるC言語の知識を必要とするだろう、ここでセーフポイントを理解するためのシンプルなの場所は、Javaコードが実行を停止することができるスレッドです。
https://www.jianshu.com/p/0f31a14373a2

ああ、非常に〜文字通りそれを覚えておくことが、理解することを意味し、理解されていません

サプリメント

更新が失敗した場合、それが表す場合、まず、現在のスレッドのスタックフレームにマークワードポイントのオブジェクトを確認し、これはロック再進入であることであり、次いで変位マークWordで現在のスレッドのスタックフレームに追加するヌル、オブジェクト参照フィールドポイントであります以下に示すように、再進入の数をカウントし、レコードロックオブジェクトをロックします。マークWordが検査対象が現在のスレッドのスタックフレームをポイントしない場合、プロセスはステップ6に進みます。

ここに画像を挿入説明

https://www.loongzee.com/2019/04/25/JavaSynchronized_2/

サプリメントの概要:再置き換えるによって追加

公開された545元の記事 ウォンの賞賛3209 ビュー256万+

おすすめ

転載: blog.csdn.net/dataiyangu/article/details/104979817