我需要根据一组有限的字符串在一个区域中创建一个关键部分。我希望为同一个字符串实例共享锁(有点类似于String.Intern方法)。
我正在考虑以下实现:
public class Foo
{
private readonly string _s;
private static readonly HashSet<string> _locks = new HashSet<string>();
public Foo(string s)
{
_s = s;
_locks.Add(s);
}
public void LockMethod()
{
lock(_locks.Single(l => l == _s))
{
...
}
}
}
这种方法有什么问题吗?以这种方式锁定字符串对象是否可以,并且在使用中是否存在任何线程安全问题HashSet<string>
?
例如,创建一个Dictionary<string, object>
为每个字符串实例创建一个新的锁对象会更好吗?
最终实施
根据我的建议,我采用了以下实现:
public class Foo
{
private readonly string _s;
private static readonly ConcurrentDictionary<string, object> _locks = new ConcurrentDictionary<string, object>();
public Foo(string s)
{
_s = s;
}
public void LockMethod()
{
lock(_locks.GetOrAdd(_s, _ => new object()))
{
...
}
}
}