我想创建一个同步方法,这样来自该类型线程类的所有对象一次只能访问这个函数。
在查看此网页时,它说:
通过使用同步方法来访问要协调访问的对象。这些方法是用 synchronized 关键字声明的。在给定的时间点,只能为对象调用一个同步方法。这可以防止多个线程中的同步方法相互冲突。
正如我所说,这不是我要寻找的,因为我希望能够在班级上互斥。
我想创建一个同步方法,这样来自该类型线程类的所有对象一次只能访问这个函数。
在查看此网页时,它说:
通过使用同步方法来访问要协调访问的对象。这些方法是用 synchronized 关键字声明的。在给定的时间点,只能为对象调用一个同步方法。这可以防止多个线程中的同步方法相互冲突。
正如我所说,这不是我要寻找的,因为我希望能够在班级上互斥。
要使方法在类上同步(而不是类的特定实例),请编写:
public static synchronized ReturnType methodName() {
...
}
或者
public static ReturnType methodName() {
synchronized(ThisClass.class) {
...
}
}
使用静态锁:
private final static Object lock = new Object();
public void foo() {
synchronized(lock) {
...
}
}
以为我会为后代提供更多信息。
我希望能够在类互斥的情况下进行调用。
因此,这取决于您是在谈论对类的实例还是对类的所有实例的锁定。当您在一个对象上同步时,如果其他线程锁定在同一个对象实例上,它们将阻塞。
当一个实例方法是synchronized
,它是如果你正在锁定this
。以下是相同的:
public void synchronized foo() {
...
}
如同:
public void foo() {
synchronized (this) {
...
}
}
通常,正如@Tudor 所提到的,您应该考虑使用锁定对象而不是方法synchronized
。这使您可以锁定要保护的特定线路。
任何实例方法synchronized
都会阻止对同一类实例的其他调用。如果您想阻止某个类的所有实例,那么您可以按照@JimN 的建议进行操作并同步静态方法。正如他所提到的,这与在类对象上同步是一样的:
public static synchronized ReturnType methodName() {
如果由于某种原因您需要锁定所有对象,那么我会将您的锁包装在一个单例中并使用ReentrantLock
.