繁体   English   中英

一次有多少个线程可以访问此Java对象的同步代码?

[英]How many threads may have access to the synchronized code of this Java object at any one time?

假设下面的类:

public class MyClass {
  public synchronized void methodA() {
    //...code
  }
  public synchronized void methodB() {
    //...code
  }
  public synchronized void methodC() {
    //...code
  } 
}

假定MyClass的所有同步方法都不相互调用。

我是否正确地假设1,并且在任何给定时间只有1个线程可以访问MyClass的任何代码? 例如,如果某个线程正在MyClass的实例上执行methodA(),则我认为此时没有其他线程可以调用methodB()或methodC(),但是将阻塞直到该线程执行methodA()为止。第一线程完成。

我想澄清一下我对Java并发实践Goetz(28)的理解,他指出:

“获取与对象相关联的锁不会阻止其他线程访问该对象,获取锁会阻止其他任何线程执行的唯一操作就是获取相同的锁。”

我认为在这种特殊情况下,Goetz的第一句话是不正确的。 MyClass在其3个方法中的每个方法上都使用隐式锁定-对于每个方法,隐式锁定本身就是( this )。 因此,在这种情况下,如果线程在执行methodA()时持有隐式锁,则将阻止所有其他线程访问此对象上的任何代码。

我是否正确理解方法同步和隐式锁定?

任何观点都将不胜感激!

“获取与对象相关联的锁不会阻止其他线程访问该对象,获取锁会阻止其他任何线程执行的唯一操作就是获取相同的锁。”

您的三个方法都声明为已synchronized 当这些方法之一被调用时,例如

MyClass instance = new MyClass();
instance.methodA();

当前正在执行的线程(称为A)将获取该实例的监视器。 除非A释放了其他对象,否则其他线程将无法获取该对象的监视器。 没有什么可以阻止其他线程在同一对象上调用方法。

假设您有线程A在做

instance.methodA();

和线程B做

instance.methodB();

然后,是的,线程B将不得不等待methodA完成(即,线程A释放instance引用的对象上的锁)。

但是,如果线程A在做

instance.methodA();

而线程B在做

instance.toString();

线程B完全不必等待,因为toString()对对象的监视器不执行任何操作。

暂无
暂无

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

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