繁体   English   中英

同步块和监视器对象

[英]Synchronized block and monitor objects

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

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

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

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

synchronized(this)

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

synchronized(msg) 

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

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

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

如果我们使用“this”作为监视器 object 而不是“msg”,它有何不同

synchronized(this)阻止同一个 object 对所有块的并发访问,在这种情况下,object 即方法的this ,将无法将 go 两次放入同步块。

例如[使用类似 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”捕获而不会相互干扰。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM