2011-03-02 22 views
3

クラスに同期メソッドがあり、1つのスレッドがそれを入力すると、別のスレッドが別のオブジェクトで同じメソッドを呼び出すことができます。Javaでのスレッドと同期

答えて

7

はい、方法がstaticでない場合。

​​非スタティックメソッドは、thisで同期します。したがって、この方法:

public synchronized void foo() { 
    // do stuff 
} 

はこの1つを効果的に等価です:

public void foo() { 
    synchronized(this) { 
    // do stuff 
    } 
} 

static同期メソッドは、現在のクラスに同期します。したがって、このような方法:

public static synchronized void bar() { 
    // do stuff 
} 

はこの1を効果的に等価です:

public static void bar() { 
    synchronized(ThisClass.class) { 
    // do stuff 
    } 
} 
+0

これはちょっとミスリーディングです同じ参照を共有するクラスはメソッドが静的である必要はありません。 –

+0

@ Johan: "同期されたメソッド"は、通常、その宣言で(メソッド本体内ではなく) 'synchronized'キーワードを使用するメソッドを意味します。つまり、彼らは実際に差分オブジェクトに同期します。 –

+0

驚くほど明確に、ありがとう、それを置くための多くの:) – shreyasva

0

方法は次のようにマークされている場合はい、別のスレッドがこのクラス

3

のインスタンスからこのメソッドを呼び出すことができます​​の場合、ロックはオブジェクト上に保持されます。つまり、別のオブジェクトの同じメソッドへの呼び出しはロックされません。
ただし、メソッドがstaticの場合、クラス全体で保持され、2回目の呼び出しで同時に実行することはできません[ブロックされます]