使用情况实例同步上的实习字符串
- 我正在接收的登录请求的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