簡體   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