2011-11-21 19 views
2

静的型と非静的型の両方のJava同期メソッドが、Java同期コードの書き込み中に並行して実行される可能性はありますか?Javaのメソッドの同期

+0

質問をより正確にするためにコードサンプルを投稿していただけますか? – wrschneider

+0

@ wrschneider99今、私に答えを教えてください – PENNY

+0

なぜあなたのgetterは静的メソッドですが、あなたのセッターはインスタンスメソッドですか? –

答えて

2

私はまだ質問を理解していません。私はあなたのコード例では混乱しています。静的メソッドは "this.counter"を参照していますが、 "counter"は静的です。いずれにしても

、再状態に他の答えのいくつか、考えてみます。

public static synchronized classMethod() {....} 
public synchronized instanceMethod() {...} 

「同期」は、各場合に2つの異なるものを意味します。静的なclassMethodでは、 "synchronized"はクラスオブジェクトの(Counter.class)モニターに適用され、instanceMethodの "synchronized"はオブジェクトインスタンス( "this")モニターに適用されます。

したがって、classMethodとinstanceMethodは互いにロックされません。 instanceMethodは別の非静的同期メソッドをブロックしますが、classMethodは他の静的同期メソッドをブロックします。

7

静的メソッドはクラスオブジェクトで同期されますが、非静的メソッドは呼び出されるクラスの特定のインスタンスで同期されます。したがって、それらは一般に異なるオブジェクト上で同期されるので、並列に実行することができる。

class MyClass 
{ 
    static synchronized void staticMethod1() 
    { 
     doSomething(); 
    } 

    static void staticMethod2() 
    { 
     synchronized(MyClass.class) 
     { 
      doSomething(); 
     } 
    } 

    synchronized void method1() 
    { 
     doSomething(); 
    } 

    void method2() 
    { 
     synchronized(this) 
     { 
      doSomething(); 
     } 
    } 
} 
2

あなたはクラスを持っている場合は、「テスト:次の例staticMethod1

は、後者のバージョンは、明示的に同期されているオブジェクトのみを使用することをmethod2と同じであるstaticMethod2method1と本質的に同じです静的でない場合はthis(Testクラスのインスタンス)で同期し、staticはTest.class(つまりjava.lang.Classクラスのインスタンス)で同期します。だから、そうです、それはまったく別のオブジェクトなので、並行して実行できます。

2

Java同期は、monitorの概念に基づいています。すべてのオブジェクトはモニターであり、同期されたコードのすべての部分はモニター・オブジェクトを参照します。同期された静的メソッドの場合、これはクラスオブジェクトです。同期されたインスタンスメソッドの場合はインスタンスです。同期ブロックの場合、モニター・オブジェクトが明示的に指定されます。

重要な点:2つのスレッドは、同じモニターオブジェクトで同期されていない場合、同期したコードを並列に実行できます。同期された静的メソッドと同期されたインスタンスメソッドがある場合、それらは同じモニターを持つことができないので、それらは並行して実行できます。

1

メソッドがロックされていない、オブジェクトがロックされています。別のオブジェクトを使用して、同じ同期メソッド内に2つのスレッドを持つことができます。ただし、同じオブジェクトの異なる同期メソッドを実行する2つのスレッドを持つことはできません。

静的メソッドと非静的メソッドは同じオブジェクトをロックしません。

+0

True - メソッドシグネチャに同期させることは、メソッド本体が "synchronized(this){...}"か "synchronized(Foo.class){...}"のいずれかにラップするのと同じです静的かどうか。メソッド本体でsynchronizedを明示的に使用すると、ロックするオブジェクトのモニターをより正確に制御できます。 – wrschneider

+1

また、 'wait()'を実行している場合は、同期ブロック内にスレッドをいくつでも持つことができますが、実行中のスレッドは1つだけです。 –