如果一个类中有一个同步方法,并且一个线程进入该方法,那么另一个线程可以在不同的对象上调用相同的方法。
如果方法不是静态
的,则可以实现。
synchronized
非静态方法会在this
上同步。因此,这个方法:
public synchronized void foo() {
// do stuff
}
这个与下面的代码实际上是等效的:
public void foo() {
synchronized(this) {
// do stuff
}
}
static
的同步方法会在当前类上进行同步。因此,像这样的一个方法:public static synchronized void bar() {
// do stuff
}
这个与这个等效:
public static void bar() {
synchronized(ThisClass.class) {
// do stuff
}
}
synchronized
,那么锁定是在对象上进行的。这意味着对不同对象调用相同方法时将不会被锁定。static
的,则它被整个类持有,并且不可能同时运行第二个调用[将被阻止]。是的,另一个线程可以从该类的实例调用此方法
synchronized
关键字的方法(而不是在方法体内部)。这意味着它们实际上会在不同的对象上进行同步。 - Joachim Sauer