2010-02-24 65 views
0

我正在創建一個靜態類,它將持有一些向量與信息。 我必須讓它同步,這樣如果有人正在編輯或從矢量讀取,類將被鎖定。如何鎖定(同步)一個靜態類?

這樣做的最好方法是什麼?

是否足夠有它裏面的類同步這樣的功能:

public synchronized insertIntoVector(int id) 
{ 

} 

感謝提前:)

回答

5

首先,你需要準確地定義你的「靜態類是什麼意思」。起初,我認爲你的意思是一個所有方法都是靜態的類(這並不意味着要被實例化) - 但是你的代碼片斷暗示情況並非如此。

在任何情況下,類內的同步方法如果是實例方法,則相當於synchronized(this),如果它們是靜態方法,則相當於synchronized(TheContainingClassName.class)

如果要使用所有靜態方法創建一個不可實例化的類,或者要創建一個充當單例的類,那麼同步該類的每個方法將確保只有一個線程可以調用方法立刻。

儘可能確保您的方法是原子性的;不同方法的調用可能會被其他線程交織,因此如果另一個線程調用setFoo(),那麼調用getFoo()後跟setFoo()(可能在增加foo變量之後)可能不會產生期望的效果。最好的辦法是有一個方法,如incrementFoo();或者(如果這不可能),您可以發佈同步詳細信息,以便您的調用者可以在整個調用過程中手動鎖定類/實例。

+0

我想要的是一個不應該被實例化的類。但是,當使用某些功能時,應該鎖定整個班級。 – Ikky 2010-02-24 09:15:59

+0

Andrzej Doyle似乎正確地表達了你想說的話。結論:同步靜態方法已足夠,因爲它們都與YourClass.class同步。並且要小心你在代碼裏面的代碼! – helios 2010-02-24 09:24:19

+0

感謝您的回答:) – Ikky 2010-02-24 09:31:03

1

AFAIK,Java中沒有「靜態類」這樣的東西。你的意思是隻包含靜態方法的類嗎?如果是,則

public static synchronized void insertIntoVector(int id) { 

} 

同步相對於所述類對象,這是足夠的,如果僅存在靜態方法和所有的人都同步。

如果你的意思靜態內部類(這裏所說的「靜態」具有比在靜態方法有不同的含義),然後

public synchronized void insertIntoVector(int id) 
{ 

} 

同步相對於靜態內部類的一個實例。

+0

感謝您的回答:) – Ikky 2010-02-24 09:30:30