我正在創建一個靜態類,它將持有一些向量與信息。 我必須讓它同步,這樣如果有人正在編輯或從矢量讀取,類將被鎖定。如何鎖定(同步)一個靜態類?
這樣做的最好方法是什麼?
是否足夠有它裏面的類同步這樣的功能:
public synchronized insertIntoVector(int id)
{
}
感謝提前:)
我正在創建一個靜態類,它將持有一些向量與信息。 我必須讓它同步,這樣如果有人正在編輯或從矢量讀取,類將被鎖定。如何鎖定(同步)一個靜態類?
這樣做的最好方法是什麼?
是否足夠有它裏面的類同步這樣的功能:
public synchronized insertIntoVector(int id)
{
}
感謝提前:)
首先,你需要準確地定義你的「靜態類是什麼意思」。起初,我認爲你的意思是一個所有方法都是靜態的類(這並不意味着要被實例化) - 但是你的代碼片斷暗示情況並非如此。
在任何情況下,類內的同步方法如果是實例方法,則相當於synchronized(this)
,如果它們是靜態方法,則相當於synchronized(TheContainingClassName.class)
。
如果要使用所有靜態方法創建一個不可實例化的類,或者要創建一個充當單例的類,那麼同步該類的每個方法將確保只有一個線程可以調用方法立刻。
儘可能確保您的方法是原子性的;不同方法的調用可能會被其他線程交織,因此如果另一個線程調用setFoo()
,那麼調用getFoo()
後跟setFoo()
(可能在增加foo變量之後)可能不會產生期望的效果。最好的辦法是有一個方法,如incrementFoo()
;或者(如果這不可能),您可以發佈同步詳細信息,以便您的調用者可以在整個調用過程中手動鎖定類/實例。
AFAIK,Java中沒有「靜態類」這樣的東西。你的意思是隻包含靜態方法的類嗎?如果是,則
public static synchronized void insertIntoVector(int id) {
}
同步相對於所述類對象,這是足夠的,如果僅存在靜態方法和所有的人都同步。
如果你的意思靜態內部類(這裏所說的「靜態」具有比在靜態方法有不同的含義),然後
public synchronized void insertIntoVector(int id)
{
}
同步相對於靜態內部類的一個實例。
感謝您的回答:) – Ikky 2010-02-24 09:30:30
我想要的是一個不應該被實例化的類。但是,當使用某些功能時,應該鎖定整個班級。 – Ikky 2010-02-24 09:15:59
Andrzej Doyle似乎正確地表達了你想說的話。結論:同步靜態方法已足夠,因爲它們都與YourClass.class同步。並且要小心你在代碼裏面的代碼! – helios 2010-02-24 09:24:19
感謝您的回答:) – Ikky 2010-02-24 09:31:03