繁体   English   中英

如何同步一组线程?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM