可能性の重複:
How do synchronized static methods work in Java?Javaの静的シンクロナイズド
誰かが私には次の2つの関数の基本的な違いを理解させることができます:
public static void synchronized f() {… }
と
public void synchronized f() {… }
可能性の重複:
How do synchronized static methods work in Java?Javaの静的シンクロナイズド
誰かが私には次の2つの関数の基本的な違いを理解させることができます:
public static void synchronized f() {… }
と
public void synchronized f() {… }
「静的同期」メソッドでは、同期されるロックはクラス自体にあります。 「同期化(synchornized)」メソッドでは、ロックがオブジェクト上にあります。これは、「静的同期」メソッドが実行中の「同期」メソッドによってブロックされないことを意味し、逆も同様です。詳細については、以下を参照してください。http://geekexplains.blogspot.com/2008/07/synchronization-of-static-and-instance.html
を
public void synchronized f(){...}
同期の場合には、封入クラスのインスタンスごとです。これは、複数のスレッドがのクラスのインスタンスでf
を呼び出すことができることを意味します。
public static void synchronized f(){...}
について
は、一度に1つのスレッドにかかわらず、包含するクラスのインスタンスの数の、そのメソッドを呼び出すことができます。
技術的には、最初の例ので撮影されたモニタはオブジェクトインスタンスのものであり、2番目の例のモニタ取得はClass
オブジェクトのものです。あなたが別のClassLoaders
に同じ名前のクラスを持っている場合は、はが同じモニターを共有していないが、これは、あなたが遭遇しそうだディテールである、ということ
は注意してください。
Javaで "synchronized"の代わりに "synchronized"キーワードを使用しないで同じスレッドアクセス制限があるとしますか? – randon
['Lock'](http://download.oracle.com/javase/6/docs/api/java/util/concurrent/locks/Lock)のいずれかを使用して、' synchronized'と同じセマンティクスを得ることができます。 html)の実装です。 –
私は思う:
public void synchronized f() {… }
は、オブジェクト自体(this
)に同期し
public static void synchronized f() {… }
は、オブジェクト(object.getClass()
またはSomeClass.getClass
)のClass
インスタンスを同期化
私は仮定し
'this.getClass()'は静的メソッドの場合は意味を持ちません。私はあなたが 'SomeClass.class'を意味すると思う。 –
@マークはい、ありがとうございます。私は自分の投稿を編集します。とにかく私は正しいですか? – Thresh
間違っている可能性がありますメソッド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に一つだけのメソッド呼び出しがで実行されるように、両方のバージョンのロックされます一度。
"静的メソッド呼び出しをロックしません"、それは '.class'オブジェクトをロックします。 –
@ Oliのリンクにある[second answer](http://stackoverflow.com/questions/578904/how-do-synchronized-static-methodswork-in-java/582500#582500)は、この質問に直接答えます。 –