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