如果一个类中有一个synchronized方法,并且有一个线程输入它,那么另一个线程可以在另一个对象上调用相同的方法。
答案 0 :(得分:7)
是的,如果方法不是static
。
synchronized
非静态方法在this
上同步。所以这个方法:
public synchronized void foo() {
// do stuff
}
实际上相当于这个:
public void foo() {
synchronized(this) {
// do stuff
}
}
static
synchronized方法在当前类上同步。所以这样的方法:
public static synchronized void bar() {
// do stuff
}
实际上相当于这个:
public static void bar() {
synchronized(ThisClass.class) {
// do stuff
}
}
答案 1 :(得分:3)
如果方法标记为synchronized
,则锁定保留在对象上。这意味着不会锁定对不同对象的相同方法的调用
但是,如果该方法是static
,那么它将由整个类保留,并且第二次调用不可能同时运行它[并将被阻止]
答案 2 :(得分:0)
是的,另一个线程可以从这个类的实例中调用此方法