.classファイル用のJava同期ブロック
-
20-09-2019 - |
質問
このJavaコードは何を意味するのでしょうか?それはMyClass
のすべてのオブジェクトのロックを獲得するのだろうか?
synchronized(MyClass.class) {
//is all objects of MyClass are thread-safe now ??
}
そして、上記のコードはこの1つの違いについて:
synchronized(this) {
//is all objects of MyClass are thread-safe now ??
}
解決
スニペットsynchronized(X.class)
はモニタとしてクラスのインスタンスを使用します。唯一のクラスインスタンス(実行時にクラスのメタデータを表すオブジェクト)が存在するように一つのスレッドがこのブロックであってもよいです。
synchronized(this)
ブロックでは、インスタンスによって守られています。すべてのインスタンスに対してのみ1つのスレッドのブロックを入力することができます。
synchronized(X.class)
は、ブロック内の1つのスレッドが正確に存在していることを確認するために使用されます。 synchronized(this)
は、インスタンスごとに1つのスレッドがあることを保証します。これはブロック内の実際のコードを作る場合は、スレッドセーフでは実装に依存します。インスタンスsynchronized(this)
ののmutateだけ状態が十分である場合。
他のヒント
他の回答に追加するには:
static void myMethod() {
synchronized(MyClass.class) {
//code
}
}
タグに相当します
static synchronized void myMethod() {
//code
}
と
void myMethod() {
synchronized(this) {
//code
}
}
タグに相当します
synchronized void myMethod() {
//code
}
いいえ、最初はMyClass
のクラス定義ではなく、それのすべてのインスタンスのロックを取得します。彼らは、単一のクラス定義を共有しているためしかし、インスタンスで使用される場合、これは事実上、他のすべてのインスタンスをブロックします。
二つ目は、現在のインスタンスのロックを取得します。
これはあなたのオブジェクトはスレッドセーフになりかどうかに関しては、それははるかに複雑な問題です! - 私たちはあなたのコードを見て必要があると思います。
所属していません StackOverflow