2012-04-16 14 views
3

javaのsyncrhonized静的メソッド

だから、これは上のsyncrhonizingされているどのような二つの質問

  1. に私をリード?クラス、または何か他の?
  2. クラスに対して同期することはできますか?そのクラスのすべてのオブジェクトもロックしますか?例えば

あなたはこの

synchronized(Foo) // where Foo is a class 
{ 
} 
+0

はい、それは 'Class'オブジェクトで同期しています。私はあなたの2番目の質問を正しく理解しているかどうか分かりません。 – Jeffrey

+0

私は今それを行うでしょう – rubixibuc

+0

1) 'Class'オブジェクトで同期しています。 2)実際には 'synchronized(Foo.class) 'であるべきです – fireshadow52

答えて

3

MyClassで静的メソッドを同期行うことができ、本質的にsynchronized(MyClass.class)ブロックと同じです。 2番目の例は、

synchronized(Foo.class) { 
} 

となるように書き直す必要があります。

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

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

+0

は構文的には同じですが、Foo.classを使用しないとコンパイラエラーが発生しますが、コンパイラは何を意味するのかを知っていますか? – rubixibuc

+0

@rubixibucコンパイラは、 'synchronized'ブロックのカッコ内で指定されるオブジェクトを評価する式を期待しています。 'Foo'はオブジェクトに評価される式ではないので、コンパイルエラーが発生するはずです。 – dasblinkenlight

3

はい、Classオブジェクトで同期しています。任意のClassオブジェクトで同期できます。リテラル()を使用するか、FooというインスタンスのgetClass()メソッドを使用できます。 、それをなしhttp://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

+0

Doe Foo自体は暗黙のうちに常にクラスオブジェクトを参照していますか? – rubixibuc

+0

@rubixibucいいえ、そうではありません、それは 'class'ではなく* type *' Foo'を指します。 – Jeffrey

+0

シンクロナイゼーションブロックの場合は参照ですか? – rubixibuc

2
  1. それはclassオブジェクト上で同期している、例えばMyClass.class
  2. :同期の詳細については

    (その道では2ページ目には、ロック同期方法が使用かに関する情報が含まれています)クラスのオブジェクトをロックしない

0

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

Java言語仕様の関連部分は8.4.3.6, 'synchronized Methods'ある:

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

関連する問題