[英]how to synchronize a group of threads?
我想做一个同步的方法,这样来自该类型的线程类的所有对象一次只能访问一个函数。
在查看此网页时 ,它表示:
通过使用同步方法来访问要为其协调访问的对象。 这些方法用synced关键字声明。 在给定的时间点只能为一个对象调用一个同步方法。 这样可以防止多个线程中的同步方法相互冲突。
正如我所说,这不是我想要的,因为我希望能够在类上互斥。
要使方法在类上同步(而不是类的特定实例),请编写:
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
编写一些锁定/解锁方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.