0

我想创建一个同步方法,这样来自该类型线程的所有对象一次只能访问这个函数。

在查看此网页时,它说:

通过使用同步方法来访问要协调访问的对象。这些方法是用 synchronized 关键字声明的。在给定的时间点,只能为对象调用一个同步方法。这可以防止多个线程中的同步方法相互冲突。

正如我所说,这不是我要寻找的,因为我希望能够在班级上互斥。

4

3 回答 3

1

要使方法在类上同步(而不是类的特定实例),请编写:

public static synchronized ReturnType methodName() {
  ...
}

或者

public static ReturnType methodName() {
  synchronized(ThisClass.class) {
    ...
  }
}
于 2012-09-21T01:59:42.490 回答
0

使用静态锁:

private final static Object lock = new Object();

public void foo() {
    synchronized(lock) {
        ...
    }
}
于 2012-09-21T08:21:36.250 回答
0

以为我会为后代提供更多信息。

我希望能够在类互斥的情况下进行调用。

因此,这取决于您是在谈论对类的实例还是对类的所有实例的锁定。当您在一个对象上同步时,如果其他线程锁定在同一个对象实例上,它们将阻塞。

当一个实例方法是synchronized,它是如果你正在锁定this。以下是相同的:

  public void synchronized foo() {
     ...
  }

如同:

  public void foo() {
     synchronized (this) {
        ...
     }
  }

通常,正如@Tudor 所提到的,您应该考虑使用锁定对象而不是方法synchronized。这使您可以锁定要保护的特定线路。

任何实例方法synchronized都会阻止对同一类实例的其他调用。如果您想阻止某个类的所有实例,那么您可以按照@JimN 的建议进行操作并同步静态方法。正如他所提到的,这与在类对象上同步是一样的:

public static synchronized ReturnType methodName() {

如果由于某种原因您需要锁定所有对象,那么我会将您的锁包装在一个单例中并使用ReentrantLock.

于 2012-09-25T21:46:51.350 回答