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番目は、現在のインスタンスのみでロックを取得します。
これによりオブジェクトがスレッドセーフになるかどうかは、はるかに複雑な質問です。コードを確認する必要があります。