我正在 asp.net mvc 应用程序中实现缓存,为了防止刷新缓存时查询多次运行,我在任何数据库访问代码周围使用了锁。
由于我对每条数据都有一个唯一的缓存键,因此我认为锁定该字符串可能是一个好主意。但有时要获取的数据对于特定用户来说是唯一的(例如用户 X 编写的所有评论),因此我使用 String.Format() 将用户的 id 放入缓存键中。
这是一个例子:
private const string cacheKey = "blog_comments_from_specific_user-{0}";
private List<Comments> GetCommentsFromuser(int userId)
{
if (GetCache(String.Format(cacheKey, userId)) == null)
{
lock (String.Format(cacheKey, userId))
{
if (GetCache(String.Format(cacheKey, userId)) == null)
{
// get data from database
}
}
}
}
我希望数据库代码对每个唯一的字符串内容仅运行一次,但我不确定这是否就是它正在做的事情。我还没有找到测试它的方法。我读到有一个 String.Intern() 方法可以锁定特定的字符串内容,但我是否也需要它,或者 String.Format() 足够了吗?
最佳答案
不要锁定字符串。它们具有微妙的行为(实习、应用程序域重用、在其他位置的不可预测的使用),这使得它们不适合这样做。如果您想要按键锁定,请创建一个键(字符串)的字典(或类似的;Hashtable
具有更好的线程语义,但不是通用的)来锁定对象(可能只是 new 对象) ()
)。
关于c# - 锁定 String.Format(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23008128/