[英]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.