10

嗨,有人可以解释一下以下代码中的同步代码是否会限制对线程的访问。如果是,它与如果我们使用“this”而不是“msg”作为监控对象有何不同。

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

3 回答 3

18

仅当两个线程使用完全相同的msg对象调用此方法时,您编写的方法才会阻塞。

如果您对此进行同步,那么在给定时间只有一个线程能够调用该方法。

于 2012-04-05T19:42:18.193 回答
10
synchronized(this)

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

synchronized(msg) 

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

于 2012-04-05T19:43:35.657 回答
1

如果在以下代码中,同步代码将限制对线程的访问

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

如果我们使用“this”而不是“msg”作为监控对象,它有什么不同?

synchronized(this)防止同一对象对所有块的并发访问,在这种情况下,作为this方法的对象,将无法两次进入同步块。

例如[使用类似 java 的伪代码]:

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

当前方法不允许线程1和线程2同时调用块

然而:

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

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

于 2012-04-05T19:44:25.767 回答