web-dev-qa-db-ja.com

Java .classの同期ブロック

Javaコードはどういう意味ですか?MyClassのすべてのオブジェクトをロックしますか?]

synchronized(MyClass.class) {
   //is all objects of MyClass are thread-safe now ??
}

そして、上記のコードがこれとどのように異なるか:

synchronized(this) {
   //is all objects of MyClass are thread-safe now ??
}
96
user249739

スニペットsynchronized(X.class)は、クラスインスタンスをモニターとして使用します。クラスインスタンス(実行時のクラスメタデータを表すオブジェクト)は1つしかないため、このブロックには1つのスレッドを含めることができます。

synchronized(this)を使用すると、ブロックはインスタンスによって保護されます。すべてのインスタンスについて、ブロックに入るスレッドは1つだけです。

synchronized(X.class)は、ブロックに1つのスレッドがあることを確認するために使用されます。 synchronized(this)は、インスタンスごとに正確に1つのスレッドが存在することを保証します。これにより、ブロック内の実際のコードがスレッドセーフになる場合、実装に依存します。インスタンスの状態だけを変更する場合は、synchronized(this)で十分です。

138
Thomas Jung

他の回答に追加するには:

static void myMethod() {
  synchronized(MyClass.class) {
    //code
  }
}

に等しい

static synchronized void myMethod() {
  //code
}

そして

void myMethod() {
  synchronized(this) {
    //code
  }
}

に等しい

synchronized void myMethod() {
  //code
}
78
Jorn

いいえ、最初のインスタンスはMyClassのクラス定義をロックしますが、すべてのインスタンスをロックするわけではありません。ただし、インスタンスで使用すると、単一のクラス定義を共有するため、他のすべてのインスタンスを効果的にブロックします。

2番目は、現在のインスタンスのみでロックを取得します。

これによりオブジェクトがスレッドセーフになるかどうかは、はるかに複雑な質問です。コードを確認する必要があります。

21
David M