我想做一個同步的方法,使得該類型的線程類的所有對象一次只能訪問一個函數。如何同步一組線程?
當this web page看,它說:
的對象,其訪問進行協調是通過使用synchronized方法訪問。這些方法是用synchronized關鍵字聲明的。只有一個同步方法可以在給定的時間點爲一個對象調用。這使多個線程中的同步方法不會相互衝突。
這不是我正在尋找的,正如我所說的,因爲我希望能夠在班級上互相排斥呼叫。
我想做一個同步的方法,使得該類型的線程類的所有對象一次只能訪問一個函數。如何同步一組線程?
當this web page看,它說:
的對象,其訪問進行協調是通過使用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) {
...
}
}
以爲我會爲後人提供更多信息。
我希望能夠在類上調用互斥。
所以這取決於你是否在談論上實例的類的或類的所有實例上鎖。當您在一個對象上進行同步時,如果其他線程鎖定了對象實例的同一個對象,則它們將被阻塞。
當實例方法是時,它是如果您鎖定this
。以下是一樣的:
public void synchronized foo() {
...
}
同:
public void foo() {
synchronized (this) {
...
}
}
通常情況下,作爲@Tudor提到,你應該考慮使用的鎖定對象,而不是決策方法。這使您可以鎖定要保護的特定線路。
任何的實例方法都會阻止對該類的相同實例的相同實例的其他調用。如果您想阻止某個類的所有實例,那麼您應該執行@JimN建議的操作並同步靜態方法。正如他提到,這是一樣的類對象上同步:
public static synchronized ReturnType methodName() {
如果你因爲某些原因需要跨所有對象鎖定,那麼我換你鎖在一個獨立的,並寫一些鎖定/解鎖方法使用ReentrantLock
。
Java 1.3? (無論哪種方式,該文檔已出來一段時間)。你會想看看更新的資源;自黑暗時期以來,多線程已*大大改善。 – Makoto
可能來自['java.util.concurrent'](http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/package-summary.html),自1.5開始。 – trashgod