2012-04-05 57 views
4

嗨,有人可以解释,如果在下面的代码同步代码将限制访问线程。如果是,与我们使用“this”作为监视器对象而不是“msg”有什么不同。同步块和监视对象

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 – 2012-04-05 19:37:48

+0

嗯......在一种情况下,您使用传入的对象的显示器。在另一个...你使用实例的监视器。 – 2012-04-05 19:39:39

回答

9

你写会阻止只有当两个线程调用该方法具有完全相同的味精对象的方法。

如果你在这个同步,那么它只有一个线程将能够在给定的时间调用该方法。

6
synchronized(this) 

表示仅锁定此对象实例。如果有多个线程使用此对象实例并调用此方法,则一次只能有一个线程在同步块内访问。

synchronized(msg) 

表示锁定基于msg字符串。如果您有多个线程使用此对象实例并调用此方法,则如果msg是不同实例,则多个线程可以在此同步块内访问。注意Java如何处理字符串相等以避免令人惊讶的效果。

+0

+1用于提及java Objects平等的效果 – 2014-09-02 10:01:55

0

如果在下面的代码同步代码将限制 访问线程

是。该块不能在同一个String对象上同时调用多次[实际上,在此String对象上同步的所有块]。

它是如何不同,如果我们使用“这”作为监视对象 代替“msg”中

synchronized(this)防止了由相同的对象到所有块并发访问,在这种情况下,该方法的对象this将不能进入同步块两次。

例如 [用java类伪代码]:

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

当前方法将不允许块被由线程1和线程并发调用

然而:

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

不会显示它们之间的阻塞行为 - 监视器被每个“s1”和“s2”捕获而不会互相干扰。