2012-04-05 15 views
4

こんにちは誰かが次のコードで同期コードがスレッドへのアクセスを制限するかどうか説明できます。はいの場合、 "msg"の代わりに "this"をモニターオブジェクトとして使用した場合とはどのように違うのですか?同期されたブロックとモニタオブジェクト

public void display(String msg)  
{  
    synchronized(msg)  
    {  
     for(int i=1;i<=20;i++)  
      {  
       System.out.println("Name= "+msg);  
      } 
    } 
} 
+0

http://stackoverflow.com/questions/574240/synchronized-block-vs-synchronized-methodを参照してください。 –

+0

まあ...あるケースでは、渡されたオブジェクトのモニターを使用しています。もう一方では、インスタンスのモニターを使用しています。 –

答えて

9

あなたは2つのスレッドがまったく同じMSGオブジェクトでこのメソッドを呼び出す場合にのみブロックします書いた方法。

で同期すると、このは、1つのスレッドだけが所定の時間にメソッドを呼び出すことができます。

6
synchronized(this) 

は、このオブジェクトインスタンスでのロックのみを意味します。このオブジェクトインスタンスを使用する複数のスレッドがあり、このメソッドを呼び出す場合、一度に1つのスレッドだけが同期ブロック内にアクセスできます。

synchronized(msg) 

は、msg文字列のロックを意味します。このオブジェクトインスタンスを使用してこのメ​​ソッドを呼び出す複数のスレッドがある場合、msgが異なるインスタンスであれば、複数のスレッドがこの同期ブロック内でアクセスできます。驚くべき効果を避けるためにJavaがString equalityをどのように処理するか注意してください。

+0

+1 Javaオブジェクトの等価性の効果に言及するため –

0

次のコードでは、同期コードは、スレッド

はいへ のアクセスを制限するかどうか。ブロックは、同じStringオブジェクト[実際には、このStringオブジェクトで同期化されたすべてのブロック]で同時に複数回呼び出すことはできません。代わりに、「MSG」の監視対象

synchronized(this)、この場合には、同じオブジェクトによってすべてのブロックへの同時アクセスを防止するよう、私たちは「これを」使用している場合、それは、異なる方法

、メソッドのthisであるオブジェクトは、synchronizedブロックに2回入ることができません。例えばため

[Javaのような擬似コードを使用]:

MyObject o = new MyObject(); 
Thread1: 
o.display("s1"); 
Thread2: 
o.display("s2"); 
:現在の方法は、ブロックしかしスレッド1とスレッド2

によって同時に呼び出すことを許可しません

s1 = s2; 
Thread1: 
MyObject o = new MyObject(); 
o.display(s1); 
Thread2: 
MyObject o = new MyObject(); 
o.display(s2); 

これらの間のブロック動作は表示されません - お互いを邪魔することなく、モニタが各 "s1"と "s2"にキャッチされます。

関連する問題