Java 函数中是否按类名同步在扩展类中是否有效?
我在基类中有一个methodefoo使用Synchronized(类名),还有两个扩展基类的类a和B。如果我在两个不同的线程中从一个实例和一个实例调用foo,它们会被同步吗。下面是一个示例代码:Java 函数中是否按类名同步在扩展类中是否有效?,java,synchronized,Java,Synchronized,我在基类中有一个methodefoo使用Synchronized(类名),还有两个扩展基类的类a和B。如果我在两个不同的线程中从一个实例和一个实例调用foo,它们会被同步吗。下面是一个示例代码: class BaseClass { void foo() { synchronized(BaseClass.class) // do something like increment count } }
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() ;
是的,您正在同步同一个对象。是的,这将在扩展
基类的所有类的所有实例上同步(包括基类本身)。对于整个类加载器,BaseClass.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
作为名称;为了清楚起见,我在这里更明确了。)是的。它是同步的,即使不能保证线程执行的顺序