Java中的线程和同步

3
如果一个类中有一个同步方法,并且一个线程进入该方法,那么另一个线程可以在不同的对象上调用相同的方法。
3个回答

7

如果方法不是静态的,则可以实现。

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
  }
}

这有点误导人,共享同一引用的类不需要方法是“静态”的。 - Johan Sjöberg
@Johan:一个“同步方法”通常意味着在其声明中使用synchronized关键字的方法(而不是在方法体内部)。这意味着它们实际上会在不同的对象上进行同步。 - Joachim Sauer

3
如果方法被标记为synchronized,那么锁定是在对象上进行的。这意味着对不同对象调用相同方法时将不会被锁定。
然而,如果该方法是static的,则它被整个类持有,并且不可能同时运行第二个调用[将被阻止]。

0

是的,另一个线程可以从该类的实例调用此方法


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接