JVM仮想マシンスレッドのセキュリティとロックの最適化を深く理解する


JAva操作共有データ分類
  • 可変可変のオブジェクトは、スレッドが安全であるに違いない.JAvaの基本データ型はfinalキーワードとして定義されている限り可変ではないことが保証されています.オブジェクトの場合、オブジェクトの動作がステータスに影響を及ぼさないことを保証する必要があります.-オブジェクトにステータスがある変数をfinalとして宣言します.
  • 絶対スレッドのセキュリティは非常に厳しく、「ランタイム環境にかかわらず、呼び出し元の額には追加の同期措置は必要ありません」.ほとんどは絶対的なスレッドではありません.
  • スレッドセキュリティ私たちが一般的に言っているスレッドセキュリティに対して、このオブジェクトに対して単独の操作時にスレッドが安全であることを保証し、呼び出しに追加の措置は必要ありません.
  • スレッド互換オブジェクト自体はスレッドセキュリティではありませんが、呼び出し側が同期手段を正しく使用することで、オブジェクトが同時環境で安全に使用できることを保証できます.
  • スレッド対立呼び出し側が同期をとるかどうかにかかわらず、マルチスレッド環境で同時に使用できないコード、
  • .
    スレッドセキュリティの実装方法
  • 反発同期:複数のスレッドが共有データに同時アクセスする場合、共有データが同じ時刻に1つのスレッドのみで使用されることを保証します.反発は同期を実現する手段である.JAvaにおける同期手段はsynchronizedキーワードであり,具体的には本人のスレッドに関するブログを表示することができる.反発同期の主な問題はスレッドブロックの起動による性能の問題であるため、この同期はブロック同期
  • とも呼ばれる.
  • 非ブロック同期競合検出の楽観的同時戦略に基づいて、まず操作を行い、他のスレッドが共有データを競合しなければ操作は成功し、共有データが競合し、競合が発生した場合、他の補償措置(再試行)をとり、スレッドを掛ける必要がないため、非ブロック同期である.
  • 同期スキームなし1つの方法が本来共有データに関与しない場合、同期措置を必要とせず正確性を保証する.

  • ロックの最適化
  • スピンロックと適応スピン反発同期が性能に与える最大の影響はブロックの実現であり、サスペンションスレッドとリカバリスレッドの操作はいずれもカーネル状態に移行して完了する必要があり、システムに大きな圧力をもたらすが、共有データのロック状態は太くて短い時間になるだけであり、この時間のためにリカバリスレッドをサスペンションする価値はない.物理マシンに1つ以上のプロセッサがあり、1つのプロセッサがロックを取得したスレッドを処理している場合は、後でロックを要求したスレッドをプロセッサで「ちょっと待って」、プロセッサの実行時間を放棄せずに、ロックを持っているスレッドがすぐに解放されるかどうかを確認することができます.スレッドがビジーサイクルを実行できるようにする(スピン).JDK 1.6以降はデフォルトでオン.-XX:+UserSpinning.スピンはスレッド切り替えのオーバーヘッドを回避しているが、プロセッサの時間を消費している.ロックの時間が短いと効果的で、逆にプロセッサリソースが消費される.そのためスピンのデフォルトは10回で、パラメータと-XX:PreBlockSpinで変更できる.JDK 1.6は適応スピンロックを導入し、スピン時間固定しない.
  • ロック消去仮想マシンは、コンパイラの実行時に、いくつかのコードに同期を要求するが、共有データ競合のロックが存在しないことが検出された.判断根拠は脱出分析のデータサポートである.コードがある場合、スタック上のすべてのデータが逃げて他のスレッドにアクセスされない場合は、スタック上のデータとして扱うことができ、スレッドがプライベートであると考えられ、同期ロックは自然に行う必要はありません.例
  • public String concatString(String s1,String s2,String s2){
            return s1+s2+s3;
    }

    Javacコンパイラによる自動最適化
    public String concatString(String s1,String s2,String s2){
            StringBuffer sb=new StringBuffer();
            sb.append(s1);
            sb.append(s2);
            sb.append(s3);
            return sb.toString();
    }

    StringBuffer.append()メソッドには同期ブロックがあり、sbオブジェクトにロックされていますが、仮想マシンはsbの役割ドメインがメソッドの内部にあることを発見し、永遠に逃げません.そのため、ロックはありますが、彼は安全に除去されます.
  • ロック粗化は、一般に、同期ブロックの作用範囲の制限をできるだけ小さくすることを推奨し、ロック競合がある場合、ロックを待つスレッドができるだけ早くロックを取得する可能性がある.しかし、一連の連続操作で同じオブジェクトに対してロック解除を繰り返す場合、例えば循環体に現れると不要な性能損失を招くことがあり、以上のappend()メソッドもこのような状況に属する.仮想マシンがこのような状況を検出すると、(こまごましたロック)、足かせの同期範囲が粗くなり、1回の
  • をロックするだけである.
  • 軽量レベルロックは、重量レベルロックの代わりに使用されるものではなく、マルチスレッド競合がないことを前提に、従来の重量レベルロックがオペレーティングシステムの反発量を使用して生じる性能消費を低減することを意味する.