だから、これは上のsyncrhonizingされているどのような二つの質問
- に私をリード?クラス、または何か他の?
- クラスに対して同期することはできますか?そのクラスのすべてのオブジェクトもロックしますか?例えば
あなたはこの
synchronized(Foo) // where Foo is a class
{
}
だから、これは上のsyncrhonizingされているどのような二つの質問
あなたはこの
synchronized(Foo) // where Foo is a class
{
}
がMyClass
で静的メソッドを同期行うことができ、本質的にsynchronized(MyClass.class)
ブロックと同じです。 2番目の例は、
synchronized(Foo.class) {
}
となるように書き直す必要があります。
クラス同期について防御したい場合は、クラス外に見えないプライベートな静的オブジェクトを同期する必要があります。これにより、クラスオブジェクトにを実行することにより、悪意のあるコードが静的メソッドをブロックすることを防止し、正当なメソッドをブロックします。
限り行く「すべてのオブジェクトをロックする」として、非静的メソッドは、通常のメソッドは、オブジェクトのインスタンスにロックしているためはない、そのクラスに、静的メソッドの実行によってロックされることはありませんマーク。
は構文的には同じですが、Foo.classを使用しないとコンパイラエラーが発生しますが、コンパイラは何を意味するのかを知っていますか? – rubixibuc
@rubixibucコンパイラは、 'synchronized'ブロックのカッコ内で指定されるオブジェクトを評価する式を期待しています。 'Foo'はオブジェクトに評価される式ではないので、コンパイルエラーが発生するはずです。 – dasblinkenlight
はい、Class
オブジェクトで同期しています。任意のClass
オブジェクトで同期できます。リテラル()を使用するか、Foo
というインスタンスのgetClass()
メソッドを使用できます。 、それをなしhttp://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html
class
オブジェクト上で同期している、例えばMyClass.class
(その道では2ページ目には、ロック同期方法が使用かに関する情報が含まれています)クラスのオブジェクトをロックしない
静的メソッドは、クラスをロックするオブジェクトとして使用します。
Java言語仕様の関連部分は8.4.3.6, 'synchronized Methods'ある:
同期方法は、実行する(§17.1)前にモニターを取得します。クラス(静的)メソッドの場合、メソッドのクラスのClassオブジェクトに関連付けられたモニターが使用されます。インスタンスメソッドの場合、これに関連付けられたモニター(メソッドが呼び出されたオブジェクト)が使用されます。
はい、それは 'Class'オブジェクトで同期しています。私はあなたの2番目の質問を正しく理解しているかどうか分かりません。 – Jeffrey
私は今それを行うでしょう – rubixibuc
1) 'Class'オブジェクトで同期しています。 2)実際には 'synchronized(Foo.class) 'であるべきです – fireshadow52