用例示例
当前设计
从数据库分片中获取灵感,我计划将每个用户标识的第一个字符用作同步密钥。
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
}
}
问题
答案 0 :(得分:1)
对于你的问题:Perm gen应该能够使用65,536个字符String
进行编码(应该只有几个megs)。
然而:
String
上进行同步)。答案 1 :(得分:1)
PermGen
溢出不是问题。但是:
String.intern()
是一个重量级操作,因为它需要锁定String常量池。这会降低您的吞吐量; 更重要的是,您将同步“逃避”控件的对象,例如如果您使用的库有
synchronized ("a") {
// do stuff
}
阻止某个地方,你会在不知情的情况下陷入僵局。这与在Boolean
或Integer
值上同步的问题大致相同。我建议你使用自己的锁。