この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 ??
}
この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 ??
}
このスニペットsynchronized(X.class)
は、クラス インスタンスをモニターとして使用します。クラス インスタンス (実行時にクラス メタデータを表すオブジェクト) は 1 つしかないため、このブロックには 1 つのスレッドを含めることができます。
ブロックを使用synchronized(this)
すると、インスタンスによって保護されます。すべてのインスタンスで、1 つのスレッドのみがブロックに入ることができます。
synchronized(X.class)
ブロック内のスレッドが 1 つだけであることを確認するために使用されます。synchronized(this)
インスタンスごとに 1 つのスレッドが存在することを保証します。これにより、ブロック内の実際のコードがスレッドセーフになるかどうかは、実装によって異なります。インスタンスの状態のみを変更する場合synchronized(this)
は十分です。
他の回答に追加するには:
static void myMethod() {
synchronized(MyClass.class) {
//code
}
}
と同等です
static synchronized void myMethod() {
//code
}
と
void myMethod() {
synchronized(this) {
//code
}
}
と同等です
synchronized void myMethod() {
//code
}
いいえ、最初は のMyClass
すべてのインスタンスではなく、 のクラス定義をロックします。ただし、インスタンスで使用すると、単一のクラス定義を共有するため、他のすべてのインスタンスが効果的にブロックされます。
2 番目は、現在のインスタンスのみでロックを取得します。
これによりオブジェクトがスレッド セーフになるかどうかは、はるかに複雑な問題です。コードを確認する必要があります。