2011-06-22 9 views
2

可能性の重複:
How do synchronized static methods work in Java?Javaの静的シンクロナイズド

誰かが私には次の2つの関数の基本的な違いを理解させることができます:

public static void synchronized f() {… } 

public void synchronized f() {… } 
+0

@ Oliのリンクにある[second answer](http://stackoverflow.com/questions/578904/how-do-synchronized-static-methodswork-in-java/582500#582500)は、この質問に直接答えます。 –

答えて

2

「静的同期」メソッドでは、同期されるロックはクラス自体にあります。 「同期化(synchornized)」メソッドでは、ロックがオブジェクト上にあります。これは、「静的同期」メソッドが実行中の「同期」メソッドによってブロックされないことを意味し、逆も同様です。詳細については、以下を参照してください。http://geekexplains.blogspot.com/2008/07/synchronization-of-static-and-instance.html

12

public void synchronized f(){...} 

同期の場合には、封入クラスのインスタンスごとです。これは、複数のスレッドがクラスのインスタンスでfを呼び出すことができることを意味します。

public static void synchronized f(){...} 

について

は、一度に1つのスレッドにかかわらず、包含するクラスのインスタンスの数の、そのメソッドを呼び出すことができます。

技術的には、最初の例の​​で撮影されたモニタはオブジェクトインスタンスのものであり、2番目の例のモニタ取得はClassオブジェクトのものです。あなたが別のClassLoadersに同じ名前のクラスを持っている場合は、が同じモニターを共有していないが、これは、あなたが遭遇しそうだディテールである、ということ

は注意してください。

+0

Javaで "synchronized"の代わりに "synchronized"キーワードを使用しないで同じスレッドアクセス制限があるとしますか? – randon

+1

['Lock'](http://download.oracle.com/javase/6/docs/api/java/util/concurrent/locks/Lock)のいずれかを使用して、' synchronized'と同じセマンティクスを得ることができます。 html)の実装です。 –

1

私は思う:

public void synchronized f() {… }は、オブジェクト自体(this)に同期し

public static void synchronized f() {… }は、オブジェクト(object.getClass()またはSomeClass.getClass)のClassインスタンスを同期化

私は仮定し

+0

'this.getClass()'は静的メソッドの場合は意味を持ちません。私はあなたが 'SomeClass.class'を意味すると思う。 –

+0

@マークはい、ありがとうございます。私は自分の投稿を編集します。とにかく私は正しいですか? – Thresh

0

間違っている可能性がありますメソッドfはクラスFooにあります。静的バージョンは、クラスレベル(getClass()またはFoo.classによって返されたオブジェクト)で静的メソッド呼び出しをロックします。非静的バージョンは、そのクラスの特定のインスタンスのロックされ、そう言うことができます。)静的インスタンスFの呼び出し(IN

Foo x = new Foo(); 
Foo y = new Foo(); 
// Locks method f of instance x, but NOT for y. 
x.f(); 

をFに一つだけのメソッド呼び出しがで実行されるように、両方のバージョンのロックされます一度。

+0

"静的メソッド呼び出しをロックしません"、それは '.class'オブジェクトをロックします。 –