Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 同步块和监视器对象_Java - Fatal编程技术网

Java 同步块和监视器对象

Java 同步块和监视器对象,java,Java,您好,有人能解释一下,在下面的代码中,同步代码是否会限制对线程的访问。如果是,它与使用“this”作为监视对象而不是“msg”有何不同 公共空白显示(字符串消息) { 已同步(msg) { 对于(inti=1;i只有当两个线程使用完全相同的msg对象调用此方法时,您编写的方法才会被阻止 如果您对此进行同步,那么在给定时间只有一个线程能够调用该方法 synchronized(this) 表示仅锁定此对象实例。如果有多个线程使用此对象实例并调用此方法,则一次只能有一个线程访问同步块

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

公共空白显示(字符串消息)
{    
已同步(msg)
{    

对于(inti=1;i只有当两个线程使用完全相同的msg对象调用此方法时,您编写的方法才会被阻止

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

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

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

如果在以下代码中出现错误,则同步代码将限制 访问线程

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

如果我们将“this”用作监视对象,它与 而不是“味精”

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

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

请看清楚……在一种情况下,您使用传入对象的监视器。在另一种情况下,您使用实例的监视器。+1用于提及java对象的效果
MyObject o = new MyObject();
Thread1:
o.display("s1");
Thread2:
o.display("s2");