JAvaマルチスレッド(五)---synchronizedの実現原理と応用

1126 ワード

ステップjavaマルチスレッドシリーズ記事
1 synchronized同期の実現の基礎
  • Javaの各オブジェクトは、ロック
  • として使用できます.
  • は、具体的には以下の3つの形式で表される.1.通常の同期方法では、ロックは現在のインスタンスオブジェクトです.2.静的同期メソッドの場合、ロックは現在のクラスのClassオブジェクトです.3.同期メソッドブロックの場合、ロックはSynchonizedカッコ内に配置されたオブジェクトである.
  • スレッドが同期コードブロックにアクセスしようとすると、まずロックを取得し、例外を終了または放出するとロックを解放する必要があります.

  • 2 SynchonizedのJVMでの実現原理
  • JVM仕様からは、SynchonizedのJVMにおける実装原理が見られ、JVMは、Monitorオブジェクトへのアクセスと終了に基づいて方法同期とコードブロック同期を実現するが、両者の実装の詳細は異なる.1.コードブロック同期は、monitorenterおよびmonitorexitの命令を用いる実現される.メソッド同期は別の方法で実現され,詳細はJVM仕様では詳細に説明されていない.
  • しかし、方法の同期は、同様に、この2つの命令を用いて実現することができる.monitorenter命令はコンパイル後に同期コードブロックの開始位置に挿入され、monitorexit命令はメソッドの終了および異常に挿入され、JVMは各monitorenterが対応するmonitorexitをペアにしなければならないことを保証する.
  • 任意のオブジェクトには、monitorが関連付けられており、monitorが保持されるとロックされます.スレッドがmonitorenter命令を実行すると、オブジェクトに対応するmonitorの所有権、すなわちオブジェクトのロックを取得しようと試みる.

  • 注:synchronized用のロックはJavaオブジェクトヘッダに存在します.
    リファレンス
    『java同時プログラミングの芸術』