こんな方法があれば
public synchronized static foo()
{
}
これはうまくコンパイルされます。
したがって、これは私に2つの質問をもたらします
- 同期は何ですか?クラス、または何か他のもの?
- クラスで同期できますか、そのクラスのすべてのオブジェクトもロックしますか。
たとえば、これを行うことができますか
synchronized(Foo) // where Foo is a class
{
}
こんな方法があれば
public synchronized static foo()
{
}
これはうまくコンパイルされます。
したがって、これは私に2つの質問をもたらします
たとえば、これを行うことができますか
synchronized(Foo) // where Foo is a class
{
}
の同期された静的メソッドは、基本的にブロックMyClass
と同じです。synchronized(MyClass.class)
2番目の例は次のように書き直す必要があります
synchronized(Foo.class) {
}
正しいこと。
クラスの同期について防御したい場合は、クラスの外部からは見えないプライベートな静的オブジェクトで同期する必要があります。これにより、悪意のあるコードsynchronized
がクラス オブジェクトで実行して静的メソッドをブロックし、正当なメソッドをブロックするのを防ぎます。
「すべてのオブジェクトのロック」に関する限り、マークsynchronized
された非静的メソッドは静的メソッドの実行によってロックされません。synchronized
これは、通常のメソッドがオブジェクトのクラスではなくオブジェクトのインスタンスsynchronized
をロックするためです。
はい、Class
オブジェクトで同期しています。どのClass
オブジェクトでも同期できます。そのリテラル ( Foo.class
) を使用するかgetClass()
、 のインスタンスのメソッドを使用できますFoo
。
同期の詳細については (そのトレイルの 2 ページ目には、どのロック同期メソッドを使用するかについての情報が含まれています): http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html
class
オブジェクトで同期しています。MyClass.class
静的メソッドは、クラスをロックのオブジェクトとして使用します。
Java 言語仕様の関連セクションは、8.4.3.6 の「同期メソッド」です。
同期メソッドは、実行前にモニター (§17.1) を取得します。クラス (静的) メソッドの場合、メソッドのクラスの Class オブジェクトに関連付けられたモニターが使用されます。インスタンス メソッドの場合、これ (メソッドが呼び出されたオブジェクト) に関連付けられたモニターが使用されます。