ホームページ  >  記事  >  Java  >  Java での synchronized キーワードの使用法の概要 (コード例)

Java での synchronized キーワードの使用法の概要 (コード例)

不言
不言転載
2019-01-30 11:21:013707ブラウズ

この記事では、Java での synchronized キーワードの使用法 (コード例) を紹介します。参考にしていただければ幸いです。それはあなたの役に立つでしょう。

同時プログラミングでは、synchronized キーワードは一般的な役割です。以前は synchronized キーワードを重みロックと呼んでいましたが、JDK1.6 では synchronized が最適化され、バイアス ロックと軽量ロックが導入されました。この記事では、synchronized キーワードの使用方法、バイアス ロック、軽量ロック、重いロックの違いと実装原則を紹介します。

まず、synchronized キーワードの 4 つの使用法を見てみましょう。

1. 通常のメソッドを変更します

private synchronized void synMethod(){
}

この使用法では、オブジェクト同期ロックのインスタンス。

2. 静的メソッド

private static synchronized void synMethod(){
}

synchronized を変更します。現在のクラスオブジェクトです。

3. 同期メソッド ブロック

private  void synMethod1(){
        synchronized(this){
            
        }
    }    
    private  void synMethod2(){
        synchronized(ThreadTest.class){
            
        }
    }

synMethod2 のオブジェクト インスタンスをロックします。現在のクラスオブジェクト。

ロック原則を再度紹介します

ロック原則を紹介する前に、まず Java オブジェクト ヘッダー Mark Word について理解しましょう。32-例として少し。

##ロックが偏っているかどうかロックフラグ軽量ロックスタック内のロック レコードへのポインタ0重量ロック空11##バイアスロックスレッド

##ロック ステータス

25 ビット

4ビット

1ビット

2ビット

#23 ビット

##2bit

#ミューテックス (ヘビーウェイト ロック) へのポインタ

#10

#GC

マーク

ID##エポック

オブジェクト生成年齢

#1

#01

ロックなし

オブジェクトのハッシュコード

#オブジェクト生成年齢

0

01

上の表は、オブジェクトが各ロック状態にあるときにオブジェクト ヘッダーに格納される情報を示しています。

1. バイアスされたロック

#実際の環境では、スレッドが同期ブロックにアクセスするときに、他のスレッドがロックを競合しない場合同じスレッドが複数回ロックを取得します。つまり、単一のスレッドが同期コードを実行します。この場合、スレッドが毎回ブロックされると、CPU パフォーマンスが無駄になります。この場合、バイアスされたロックの概念が導入されます。

  • 同期されたコード ブロックへのアクセス

  • ## オブジェクト ヘッダーの Mark Word に格納されているスレッド ID が現在のスレッドを指しているかどうかを確認します。そうであれば、現在のロックが再入可能であることを示します。ロックを取得して同期コードを直接実行する必要はありません。

  • #そうでない場合は、CAS アルゴリズムを使用して、オブジェクト ヘッダー内のスレッド ID を更新してみてください。
  • #正常にロックを取得し、同期コードを実行します。更新に失敗した場合は、ロックの競合が存在することを示します。グローバル セーフ ポイントを待って、バイアスされたロックを所有するスレッドを一時停止し、バイアスされたロックを軽量ロックにアップグレードするか、ロック フラグに従ってロックなしに設定するかを選択します。オブジェクトヘッダー。
  • -XX:-userBiasedLocking=false を使用すると、JVM バイアス ロックの最適化をオフにし、デフォルトで軽量ロックを直接入力できます。

2. 軽量ロック

アクセス同期コード ブロック, まず、現在のスレッドのスレッドスタックにロックレコード(Lock Record)領域を作成します。

  • オブジェクト ヘッダー Mark Word をロック レコードにコピーします。

  • CAS を使用して、オブジェクト ヘッダーのスレッド ポインターを更新してみます。Word を現在のスレッドへのポインターにマークします。

  • 更新が成功すると、軽量のロックが得られます。

  • 更新に失敗しました。Mark Word のポインタが現在のスレッドを指しているかどうかを確認してください。

  • 「はい」の場合、ロックは再入可能であることを意味します。同期されたコード ブロックを実行します

  • そうでない場合は、現時点で競合があることを意味します。軽量ロックは重量ロックに拡張する必要があります。

  • 3. ウェイト ロック

  • ウェイト ロックは、オブジェクト モニター (Monitor) に基づいて実装されます。

#スレッドが同期コードを実行するときは、Monitor.enter 命令を呼び出す必要があります。実行が終了したら、Monitor.exit 命令を呼び出します。ここで、モニターが排他的であることがわかります。ある時点で正常に参加できるのは 1 つのスレッドだけであり、他のスレッドはキュー内でのみブロックされます。したがって、このウェイトロックの運用には非常にコストがかかります。

以上がJava での synchronized キーワードの使用法の概要 (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。