10

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

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

3 に答える 3

1

次のコードで、同期されたコードがスレッドへのアクセスを制限する場合

はい。ブロックは、同じオブジェクトで複数回同時に呼び出すことはできませんString[実際には、このオブジェクトで同期されているすべてのブロックString]。

「msg」の代わりに「this」を監視オブジェクトとして使用した場合とどう違うのですか

synchronized(this)同じオブジェクトによるすべてのブロックへの同時アクセスを防止します。この場合、メソッドのオブジェクトはthis、同期ブロックに 2 回入ることができなくなります。

たとえば[Javaのような疑似コードを使用]:

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

現在のメソッドでは、ブロックを Thread1 と Thread2 から同時に呼び出すことはできません

でも:

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

それらの間のブロック動作は表示されません。モニターは、互いに干渉することなく、それぞれの「s1」と「s2」によってキャッチされます。

于 2012-04-05T19:44:25.767 に答える