フラグ-XX:+ UseBiasedLockingを使用してバイアスのかかったロックがどのように行われているかについては、継続的な同期のパフォーマンスを向上させることができます。私はそれが何をしているのか、それがどのようにパフォーマンスを改善するのかについての参照を見つけることができませんでした。Javaでバイアスされたロック
誰かが私に正確に何かを説明することができますか、いくつかのリンク/リソースを教えてくれますか?
フラグ-XX:+ UseBiasedLockingを使用してバイアスのかかったロックがどのように行われているかについては、継続的な同期のパフォーマンスを向上させることができます。私はそれが何をしているのか、それがどのようにパフォーマンスを改善するのかについての参照を見つけることができませんでした。Javaでバイアスされたロック
誰かが私に正確に何かを説明することができますか、いくつかのリンク/リソースを教えてくれますか?
を基本的に、VMは、「最適化を行うこととすることができますそのオブジェクトに対する後続のアトミック操作が同期コストを招かないような方法で、そのスレッドにそのオブジェクトを「バイアスする」。これは、通常、オブジェクトを別のスレッドに公開することなくオブジェクトをロックする過度に保守的なコードに合わせて設計されていると思います。実際の同期オーバーヘッドは、別のスレッドがオブジェクトのロックを取得しようとすると、ただちに開始されます。
これは、Java 6ではデフォルトでオンになっている
-XX:+ UseBiasedLocking は、競合のない同期化のパフォーマンスを向上させる技術を有効にします。オブジェクトは、スレッドに向かって「バイアスされ」ています。最初にスレッドは、モニタバイトバイトコードまたは同期メソッド呼び出しを介してモニタを取得します。そのスレッドによって実行される後続のモニター関連操作は、マルチプロセッサー・マシンで比較的高速です。相当量の非同期同期を持つアプリケーションの中には、このフラグを有効にすると大幅に高速化するものがあります。ロックの特定のパターンを持つアプリケーションの中には、悪影響を最小限に抑えるための試みが行われているものの、減速が見られる場合があります。
これはあなたの質問に答えませんか?
http://www.oracle.com/technetwork/java/tuning-139912.html#section4.2.5
競合しない 同期のパフォーマンスを向上させる技術を有効にします。オブジェクトは、最初に がmonitorenterバイトコードまたは同期された メソッド呼び出しを介してモニタを取得するスレッドに向かって「偏っている」。そのスレッドがマルチプロセッサー・マシンで比較的高速に実行された後のモニター関連操作は です。 重要な量の非同期の同期がある のアプリケーションは、このフラグを有効にするとかなりのスピードアップを達成する可能性があります。 の影響を最小限に抑えようとしていますが、特定のロックパターンを持つアプリケーションの中には、 の減速が見られることがあります。
デフォルトで1.6になっていると思いますが、有効なフラグが何かを確認するには、PrintFlagsFinal診断オプションを使用します。フラグが異なる可能性があるため、サーバーアプリケーションのための調査している場合は、-server指定していることを確認してください:あなたのオブジェクトは1つのスレッドだけロックされている場合
私はバイアスされたロックについて自分自身が不思議でした。
しかし、javaのバイアスされたロックは、IntelのNehalemプロセッサでは通常のロックよりも遅く、おそらくnehalem以降の2世代のプロセッサでは遅くなっているようです。http://mechanical-sympathy.blogspot.com/2011/11/java-lock-implementations.html と、ここで、ここでまたhttp://www.azulsystems.com/blog/cliff/2011-11-16-a-short-conversation-on-biased-locking
より多くの情報を参照してくださいhttps://blogs.oracle.com/dave/entry/biased_locking_in_hotspot
私はインテルにバイアスされたロックを取り消すためにいくつかの比較的安価な方法があることを期待してきたが、私はそれがないと信じ始めています可能。私が行ったことがわかった記事は次のいずれかに依存しています: 1)スレッドを停止するためにosを使用してください 2)シグナルを送信します。つまり、もう一方のスレッドでコードを実行しています 3)多くの場合、他のスレッドで実行されるのを待つ(これはjavaと同じです)。 4)リターンの呼び出しである同様の安全ポイントを持ち、他のスレッドはコードをブレークポイントに変更します...