【问题标题】:Synchronized block and monitor objects同步块和监控对象
【发布时间】:2012-04-05 19:35:33
【问题描述】:

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

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

【问题讨论】:

标签: java


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:
    synchronized(this)
    

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

    synchronized(msg) 
    

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

    【讨论】:

    • +1 用于提及 java 对象相等的效果
    【解决方案3】:

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

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

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

    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”捕获而不会相互干扰。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-09
      • 1970-01-01
      • 2012-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多