3

こんな方法があれば

public synchronized static foo()
{

}

これはうまくコンパイルされます。

したがって、これは私に2つの質問をもたらします

  1. 同期は何ですか?クラス、または何か他のもの?
  2. クラスで同期できますか、そのクラスのすべてのオブジェクトもロックしますか。

たとえば、これを行うことができますか

synchronized(Foo) // where Foo is a class
{
}
4

4 に答える 4

3

の同期された静的メソッドは、基本的にブロックMyClassと同じです。synchronized(MyClass.class)2番目の例は次のように書き直す必要があります

synchronized(Foo.class) {
}

正しいこと。

クラスの同期について防御したい場合は、クラスの外部からは見えないプライベートな静的オブジェクトで同期する必要があります。これにより、悪意のあるコードsynchronizedがクラス オブジェクトで実行して静的メソッドをブロックし、正当なメソッドをブロックするのを防ぎます。

「すべてのオブジェクトのロック」に関する限り、マークsynchronizedされた非静的メソッドは静的メソッドの実行によってロックされません。synchronizedこれは、通常のメソッドがオブジェクトのクラスではなくオブジェクトのインスタンスsynchronizedをロックするためです。

于 2012-04-16T01:33:49.713 に答える
3

はい、Classオブジェクトで同期しています。どのClassオブジェクトでも同期できます。そのリテラル ( Foo.class) を使用するかgetClass()、 のインスタンスのメソッドを使用できますFoo

同期の詳細については (そのトレイルの 2 ページ目には、どのロック同期メソッドを使用するかについての情報が含まれています): http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

于 2012-04-16T01:36:01.940 に答える
2
  1. classオブジェクトで同期しています。MyClass.class
  2. いいえ、クラスのオブジェクトをロックしません
于 2012-04-16T01:36:39.190 に答える
0

静的メソッドは、クラスをロックのオブジェクトとして使用します。

Java 言語仕様の関連セクションは、8.4.3.6 の「同期メソッド」です。

同期メソッドは、実行前にモニター (§17.1) を取得します。クラス (静的) メソッドの場合、メソッドのクラスの Class オブジェクトに関連付けられたモニターが使用されます。インスタンス メソッドの場合、これ (メソッドが呼び出されたオブジェクト) に関連付けられたモニターが使用されます。

于 2012-04-16T01:41:41.357 に答える