111

この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 ??
}
4

4 に答える 4

154

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

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

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

于 2010-01-13T11:35:51.300 に答える
91

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

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

と同等です

static synchronized void myMethod() {
  //code
}

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

と同等です

synchronized void myMethod() {
  //code
}
于 2010-01-13T12:45:27.377 に答える
23

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

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

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

于 2010-01-13T11:35:30.863 に答える