我在基类中有一个方法 foo 使用 Synchronized (类名) ,以及扩展基类的两个类 A 和 B 。如果我在两个不同的线程中从 A 实例和 B 实例调用 foo,它们会同步吗?这是一个示例代码:
class BaseClass {
void foo() {
synchronized(BaseClass.class)
// do something like increment count
}
}
class A extends BaseClass {
}
class B extends BaseClass {
}
A a = new A();
B b = new B();
//in thread 1
a.foo() ;
//in thread 2
b.foo() ;
是的,这将同步all的实例all类扩展BaseClass
(包括BaseClass
本身)。这BaseClass.class
引用基本上是整个类加载器的单个引用。你真的想要那个吗?
Usually,当需要同步时,静态方法应该在静态的东西上同步,而实例方法应该在与实例相关的东西上同步。就我个人而言,我不喜欢同步this
or a Class
引用 - 由于这两个引用在其他地方都可用,因此其他代码可以在同一监视器上同步,从而很难推断同步。相反,我倾向于:
public class Foo {
private final Object instanceLock = new Object();
public void doSomething() {
synchronized (instanceLock) {
// Stuff
}
}
}
public class Bar {
private static final Object staticLock = new Object();
public static void doSomething() {
synchronized (staticLock) {
// Stuff
}
}
}
(我通常实际上只是使用lock
作为名称;为了清楚起见,我只是在这里更明确地说明了这一点。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)