使用情況實例同步上的實習字符串
- 我正在接收的登錄請求的servlet。
- 如果當前正在登錄,或者用戶已經登錄,則該servlet應該中止並通知呼叫者。
當前設計
從數據庫拆分取得靈感,我打算使用每個用戶ID的第一個字符作爲同步密鑰。
void login(String userid)
{
String first = userid.substring(0, 1);
synchronized(first.intern())
{
// query the cache or database for a session token.
// if session token exists, throw an exception
}
}
問題
- 據我所知,使用字符串#實習生可能溢出PermGen的空間。在我的情況下,被轉儲到permgen的字符串是一個Unicode字符。我是否安全地使用這樣的字符串?
它如何在多處理器機器中不起作用?假設只有一個JVM。如果我使用自己的鎖,它與使用實體字符串(在多處理器機器中)有什麼不同? – 2009-08-31 08:43:32
他沒有說這不適用於多處理器機器。它不適用於多進程系統,即運行多個JVM實例的系統(無論是在單臺計算機上還是在多臺計算機上) - 'synchronized'在JVM之間不起作用。 – Jesper 2009-08-31 12:12:46
謝謝。我認爲這是一個錯字。 – 2009-08-31 13:37:15