2012-09-21 66 views
0

我想做一個同步的方法,使得該類型的線程的所有對象一次只能訪問一個函數。如何同步一組線程?

this web page看,它說:

的對象,其訪問進行協調是通過使用synchronized方法訪問。這些方法是用synchronized關鍵字聲明的。只有一個同步方法可以在給定的時間點爲一個對象調用。這使多個線程中的同步方法不會相互衝突。

這不是我正在尋找的,正如我所說的,因爲我希望能夠在班級上互相排斥呼叫。

+4

Java 1.3? (無論哪種方式,該文檔已出來一段時間)。你會想看看更新的資源;自黑暗時期以來,多線程已*大大改善。 – Makoto

+0

可能來自['java.util.concurrent'](http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/package-summary.html),自1.5開始。 – trashgod

回答

1

要製作方法同步的類(而不是類的具體實例),寫:

public static synchronized ReturnType methodName() { 
    ... 
} 

public static ReturnType methodName() { 
    synchronized(ThisClass.class) { 
    ... 
    } 
} 
0

使用靜態鎖:

private final static Object lock = new Object(); 

public void foo() { 
    synchronized(lock) { 
     ... 
    } 
} 
0

以爲我會爲後人提供更多信息。

我希望能夠在類上調用互斥。

所以這取決於你是否在談論上實例的類的類的所有實例上鎖。當您在一個對象上進行同步時,如果其他線程鎖定了對象實例的同一個對象,則它們將被阻塞。

當實例方法是​​時,它是如果您鎖定this。以下是一樣的:

public void synchronized foo() { 
    ... 
    } 

同:

public void foo() { 
    synchronized (this) { 
     ... 
    } 
    } 

通常情況下,作爲@Tudor提到,你應該考慮使用的鎖定對象,而不是決策方法​​。這使您可以鎖定要保護的特定線路。

任何​​的實例方法都會阻止對該類的相同實例的相同實例的其他調用。如果您想阻止某個類的所有實例,那麼您應該執行@JimN建議的操作並同步靜態方法。正如他提到,這是一樣的類對象上同步:

public static synchronized ReturnType methodName() { 

如果你因爲某些原因需要跨所有對象鎖定,那麼我換你鎖在一個獨立的,並寫一些鎖定/解鎖方法使用ReentrantLock